html - creating a drop down list in javascript from a text file - Stack Overflow

Is this possible? If so, I could really use some help on this. I'm very new to JavaScript and thus

Is this possible? If so, I could really use some help on this. I'm very new to JavaScript and thus hardly know any of the syntactical specifications, nor proper methodology.

Some functions I wrote in an external file.

var base = base || {};

base.requestAjax = function () {

    try{

        return new XMLHttpRequest();

    } catch (e) {

        try {

            return new ActiveXObject("Msxml2.XMLHTTP");

        } catch (e) {

            try {

                return new ActiveXObject("Microsoft.XMLHTTP");

            } catch (e) {

                alert("Something is wrong with your browser! Please ensure that you have javascript functionality enabled");
                return false;
            }
        }
      }
}

base.onReadyStateChange = function(ajaxRequest, formName, formArray, method, controller) {

    var methodVerified = verifyMethod(method);

    if (!methodVerified) {
        throw new Exception("Error: please make sure the method passed matches that of \'GET\' or \'POST\'.");
    } 

    for (input in formArray) {
        document.formName.input.value = ajaxRequest.responseText;
    }

    ajaxRequest.open(method, controller, true);
    file.send(null);
}


base.writeDropDownList = function(file, method, path) {

    var file = upload.requestAjax();

    file.open(method, path, true);

    if (file.readyState != 4) {
        throw new Exception("Error: text file ready state not equal to 4!");
    }

    if (file.status != 200) {
        throw new Exception("Error: text file status not equal to 200!");
    }

    var lines = file.responseText.split("\n");

    document.writeln("<select>");

        for(line in lines) {
        document.writeln("<option>" + line + "</option>");
    }

    document.writeln("</select>");

    file.send(null);    
}

base.verifyMethod = function(method) {

    var methodLower = method.toString().toLowerCase();

    switch(methodLower) {
        case "get":
        case "post":
            return true;

        default:
            return false;
    }
}

The html code which attempts to implement it

<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="../includes/css/adsmanager.css" />
        <script type="text/javascript" src="../includes/js/base.js">
        <!--
        function createCountriesList() {
            var file = base.requestAjax;
            var path = "../includes/_notes/countries.txt";
            base.writeDropDownList(file, "GET", path);
        }
        //-->
        </script>
    </head>
    <body>

        <form name='adsManager'>
            <button type="text" value="test" onclick="createCountriesList()" />
        </form>

    </body>
</html>

I plan to use the functions for other things, so I figured I'd create a namespace. I found this as a reference and based most of my model off of it.

Thanks to all who can help.

Is this possible? If so, I could really use some help on this. I'm very new to JavaScript and thus hardly know any of the syntactical specifications, nor proper methodology.

Some functions I wrote in an external file.

var base = base || {};

base.requestAjax = function () {

    try{

        return new XMLHttpRequest();

    } catch (e) {

        try {

            return new ActiveXObject("Msxml2.XMLHTTP");

        } catch (e) {

            try {

                return new ActiveXObject("Microsoft.XMLHTTP");

            } catch (e) {

                alert("Something is wrong with your browser! Please ensure that you have javascript functionality enabled");
                return false;
            }
        }
      }
}

base.onReadyStateChange = function(ajaxRequest, formName, formArray, method, controller) {

    var methodVerified = verifyMethod(method);

    if (!methodVerified) {
        throw new Exception("Error: please make sure the method passed matches that of \'GET\' or \'POST\'.");
    } 

    for (input in formArray) {
        document.formName.input.value = ajaxRequest.responseText;
    }

    ajaxRequest.open(method, controller, true);
    file.send(null);
}


base.writeDropDownList = function(file, method, path) {

    var file = upload.requestAjax();

    file.open(method, path, true);

    if (file.readyState != 4) {
        throw new Exception("Error: text file ready state not equal to 4!");
    }

    if (file.status != 200) {
        throw new Exception("Error: text file status not equal to 200!");
    }

    var lines = file.responseText.split("\n");

    document.writeln("<select>");

        for(line in lines) {
        document.writeln("<option>" + line + "</option>");
    }

    document.writeln("</select>");

    file.send(null);    
}

base.verifyMethod = function(method) {

    var methodLower = method.toString().toLowerCase();

    switch(methodLower) {
        case "get":
        case "post":
            return true;

        default:
            return false;
    }
}

The html code which attempts to implement it

<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="../includes/css/adsmanager.css" />
        <script type="text/javascript" src="../includes/js/base.js">
        <!--
        function createCountriesList() {
            var file = base.requestAjax;
            var path = "../includes/_notes/countries.txt";
            base.writeDropDownList(file, "GET", path);
        }
        //-->
        </script>
    </head>
    <body>

        <form name='adsManager'>
            <button type="text" value="test" onclick="createCountriesList()" />
        </form>

    </body>
</html>

I plan to use the functions for other things, so I figured I'd create a namespace. I found this as a reference and based most of my model off of it.

Thanks to all who can help.

Share Improve this question asked Nov 16, 2011 at 8:16 zeboidlundzeboidlund 10.2k35 gold badges121 silver badges184 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 3

What is your point of failure? Is your Javascript sending the Ajax request and receiving the response?

Is lines getting data in this line of your code?

 var lines = file.responseText.split("\n");

If you are getting this far, iterate through lines and add options like this:

var select = document.getElementById('id');
select.options.add(new Option(lines[i]));

In your writeDropDownList method, I made a few changes: added a method that will be called when your Ajax call has pleted. In that method, you should check the response string and add the options to your select box

base.writeDropDownList = function(file, method, path) {

    var file = upload.requestAjax();    
    file.open(method, path, true);    
    file.onreadystatechange = requestComplete;
    file.send(null);    
}
  requestComplete()
  {
    if (file.readyState == 4) 
    {
       if(file.readyState == 200)
       {
           var lines = file.responseText.split("\n");
           //foreach loop to populate select
       }
   }                            
 }

In your code, you are checking and using files.responseText before you have even sent the Ajax request at files.send(null)

EDIT:

Some more ments regarding your code:

  • In the createCountriesList function, you create file and assign it a value by calling requestAjax. You then pass it to writeDropDownList function, where you assign it a value again by calling requestAjax. You see that this is redundant? There is no need to create file in createCountriesList and pass it as an argument. Create it just once in writeDropDownList.

  • in writeDropDownList you call upload.requestAjax(). What is
    upload. I don't see you initializing upload anywhere. Do you mean to call base.requestAjax()?

  • you have a function base.OnReadyStateChange but at no point are you telling your AJAX request to call that function when state changes. See the code I posted above. The function I added called
    requestComplete does that, and I tell the AJAX request to call it using file.onreadystatechange = requestComplete;

  • You set method to GET, yet you are not passing any GET values in your URL

  • in file.open(method, path, true);, path is supposed to be the URL of the script the AJAX request will call. You have set path to ../includes/_notes/countries.txt. An AJAX request cannot call a .txt file since they do not execute.

I just had a look at the source of your code, and it is all sorts of broken. Please do not use it.

What is countries.txt ? Are you attempting to populate a dropdown with a list of all countries, or some countries depending on user's input?

If the former, there is no need for Javascript / AJAX. You need to add PHP code in your html to populate the select box.

If the latter, your AJAX request should be sending the user input as a GET variable.

Some ments:

  1. Very nice code; it's readable and looks neat.
  2. I'd use a different name than base as namespace - for my liking, the word is too "mon" . Chances are that you're going to define a variable base somewhere and it will break.
  3. To create HTML from JavaScript, first create a small example in pure HTML to see how it should look like. After that, create a script which produces the same HTML using document.createElement().
  4. Look at frameworks like jQuery or Prototype because they make many boring tasks much more simple.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745660314a4638794.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信