在javascript闭包中加载XML文件一次

时间:2012-04-27 08:49:50

标签: javascript xml closures

我目前正在尝试创建一个javascript闭包,它将使用我拥有的XML文件中的值创建一个下拉列表。我已经使它适用于大多数代码,并且每次我必须使用它时都会加载XML文件。我想让代码更高效,并且只加载一次XML文件。我尝试使用下面的代码执行此操作,但不断收到错误。

这是我关闭的代码......

var closure = function() {

    var xmlDoc;

    return{

            setXML: function()
            {
                xmlDoc = this.loadXMLDoc("feed.xml");
            },


            loadXMLDoc: function(dname)
            {
                if (window.XMLHttpRequest)
                {
                    xhttp=new XMLHttpRequest();
                }
                else
                {
                    xhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }

                xhttp.open("GET",dname, false);
                xhttp.send();
                return xhttp.responseXML;
            },


            createField: function() 
            {
                x = xmlDoc.getElementsByTagName("name");
                //code to create the drop down box
            },

            findValue: function() 
            {
                y = xmlDoc.getElementsByTagName("value");
                //code to find value
            }

   };

}();

这是调用函数的代码......

$(document).ready(function () {
    closure.setXML();
});

我得到的错误是'无法调用方法'未定义'的getElementsByTagName',这可以在createField函数中找到。这是我尝试使用xmlDoc的第一个例子。

非常感谢有关此问题的任何帮助或教程。

1 个答案:

答案 0 :(得分:1)

既然你是doint jQuery,为什么不在你的闭包中使用jQuery呢?如果xmlDocundefined,则必须加载问题。尝试执行console.log以查看执行AJAX后是否返回了任何数据。

var closure = (function($) {

    var xmlDoc;

    return {
        setXML: function() {
            this.loadXMLDoc("feed.xml", function(data) {
                xmlDoc = data;
            });
        },
        loadXMLDoc: function(dname, callback) {
            $.get(dname, function(data) {

                //a possible point of failure
                //do console.log(data) to see if anything was returned

                callback(data);
            }, 'xml');
        },
        createField: function() {
            x = $("name",xmlDoc);
            //code to create the drop down box
        },
        findValue: function() {
            y = $("value",xmlDoc);
            //code to find value
        }
    };
}(jQuery));​