未捕获的TypeError:无法调用未定义的方法'hasChildNodes'

时间:2013-02-04 05:48:16

标签: javascript xml google-chrome jquery

我正在尝试使用jquery中的ajax请求读取XML。下面是代码,它在IE中工作正常,但是当我在Chrome上运行时,我遇到了这个错误

  

未捕获的TypeError:无法调用未定义的方法'hasChildNodes'

$.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()){

有谁能告诉我哪里出错了。

提前致谢!

1 个答案:

答案 0 :(得分:2)

你这样做:

z=childs[i].childNodes;

然后,在adChilds(z,childs,oNode);的第一行,您正在执行此操作:

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

但是,i不是a子项的索引。它是一个孩子的父母的索引。因此,如果a的父级与a的孩子数量不同,则您将会超出索引范围。

我不确切地知道你在adChilds()中想要完成什么,所以我不确定要提出什么修正,但我认为如果你想与a的孩子打交道,你应该得到a的子女数,并确保你只能访问实际存在的数字


一些编码建议:

  1. 我强烈建议你使用真正的变量名。中间变量的abcz等名称含糊不清,使您的代码难以阅读。

  2. 所有局部变量在第一次定义时应在var之前(或在函数顶部定义),否则它们会成为全局变量,这会引起麻烦,特别是对于异步回调函数。 / p>

  3. 当您在第一次检查代码时看到对您来说不明显的错误时,请在您喜欢的调试器中设置断点并逐步执行代码并检查变量的状态以确定您的确切原因得到错误。如果您不知道如何使用调试器,请了解。它们内置于大多数浏览器中,对于高效调试而言非常简单且绝对必不可少。