2012-04-27 15 views
0

我目前正在尝试创建一个javascript闭包,该闭包将使用我所拥有的XML文件中的值创建一个下拉列表。我已经为大部分代码工作,并且每次必须使用它时都会加载XML文件。我想让代码更高效,但只加载一次XML文件。我试图使用下面的代码来做到这一点,但不断收到错误。在javascript关闭中加载一次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'的undefined',它可以在createField函数中找到。这是我尝试使用xmlDoc的第一个实例。

任何关于这个问题的帮助或教程是非常感谢。

回答

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));​ 
+0

我试过实现这个,但回来的错误'回调是未定义'。它似乎工作,因为console.log(数据)返回所有的XML数据。 – Phil 2012-04-27 09:18:53

+0

@Phil [似乎在这里工作](http://jsfiddle.net/vC8ZQ/)。 'callback'是调用'loadXMLDoc'时传递的函数。如果完全没有回调,它只能是'undefined'。 – Joseph 2012-04-27 09:27:29

+0

对不起,我错过了部分代码,我总是尝试使用自己的代码来修改代码,而不是仅仅复制和粘贴,因为我想了解它是如何工作的......非常感谢 – Phil 2012-04-27 09:37:26