2013-02-04 133 views
1

我正尝试在jQuery中使用ajax请求读取XML。下面是代码,它在IE浏览器工作正常,但是当我在Chrome运行此我面对这个错误未捕获TypeError:无法调用未定义的方法'hasChildNodes'

Uncaught TypeError: Cannot call method 'hasChildNodes' of undefined

$.ajax({ 

    type: "GET", 
    url: "tree1.xml", 
    dataType:"xml", 
    success: function(xml){ 
     root=xml.documentElement; 
     childs=root.childNodes; 
     for(var i=0;i<childs.length;i++){ 
      z=childs[i].childNodes; 
      adChilds(z,childs,oNode); 


      function adChilds(a,b,c){ 
       if(a[i].hasChildNodes()){ 
        adNode(b[i].nodeName,c); 
        var oNode_ch=oNode1; 
        for(var j=0;j<a.length;j++){ 
         child1=a[j].childNodes; 
         adNode(child1[0].nodeValue,oNode_ch); 
        } 
       } 
       else{adNode(a[0].nodeValue,oNode);} 
      } 
     } 

错误是在该行指出。

如果(A [1] .hasChildNodes()){

任何人都可以给我建议我该怎么错在何处。

在此先感谢!

+0

嗯......看起来'a [i]'是'undefined',所以请使用'console.log()'检查变量的值以开始调试。 –

回答

2

你这样做:

z=childs[i].childNodes; 

然后,在adChilds(z,childs,oNode);第一线,你这样做是:

if(a[i].hasChildNodes()){ 

但是,i不是一个索引儿童的a。这是一个儿童父母的索引。因此,如果a的父母的子女数量与a的子女数量不相同,则您将退出索引。

我不确定你想在adChilds()中完成什么工作,所以我不确定什么修复建议,但我想你,如果你想处理a的孩子,你应该得到的a儿童的数量,并确保你只能访问实际存在


一些编码建议人数:

  1. 我强烈建议你使用真正的变量名。像a,b,cz这样的名称对于中间变量来说是神秘的,并且让你的代码难以阅读。

  2. 所有局部变量在第一次定义时(或者在函数的顶部定义)应该以var开头,否则它们会成为全局变量,特别是异步回调函数。

  3. 当您首次检查代码时发现不明显的错误时,请在您最喜欢的调试器中设置一个断点,然后遍历代码并检查变量的状态以查看确切原因得到错误。如果您不知道如何使用调试器,请学习。它们内置于大多数浏览器中,对于高效调试非常简单且绝对必要。

+0

感谢您的建议!并清除一些东西。从现在开始我会记住这一点:) – Yunkhan

相关问题