代码之家  ›  专栏  ›  技术社区  ›  Arlen Beiler

代码不工作,无法读取未定义的属性“className”

  •  1
  • Arlen Beiler  · 技术社区  · 15 年前

    var divarray = [];
    var articleHTML = [];
    var absHTML;
    var keyHTML;
    var bodyHTML = [];
    var i = 0;
    divarray = document.getElementById("yui-main").getElementsByTagName("div");
    for ( var j in divarray) {
        if(divarray[i].className == "articleBody"){
            articleHTML = divarray[i];
            for( var k in articleHTML ){
                bodyHTML[i] = '';
                if(articleHTML[i].className == "issueMiniFeature"){continue;}
                if(articleHTML[i].className == "abstract"){absHTML = articleHTML[i]; continue;}
                if(articleHTML[i].className == "journalKeywords"){keyHTML = articleHTML[i]; continue;}
                bodyHTML[i] = articleHTML[i];
            }
            break;
        }
        i++;
    }
    

    我得到的错误是:

    TypeError: Cannot read property 'className' of undefined
    

    我用的是谷歌浏览器。

    3 回复  |  直到 15 年前
        1
  •  3
  •   kennytm    15 年前

    你使用了一个非常奇怪的循环。

     for (var j in array) {
        // use array[i]
        ++ i
     }
    

    问题是 .getElementsByTagName 不返回数组,但返回类似数组的接口。例如:

    >>> for (var j in document.getElementsByTagName('body')) console.log(j)
    0
    length
    item
    namedItem
    

    for / in i 将上升到 array.length + 2 而不是 array.length - 1 . 自 array[array.length + 2] undefined 并在尝试访问其属性时抛出错误。


    总是用

    for (var i = 0, len = array.length; i < len; ++ i) {
      ...
    }
    

        2
  •  2
  •   Chuck    15 年前

    初始化 articleHTML 作为一个数组,那么你显然是在设置 到HTMLElement( divarray[i] articleHTML[i] )这实际上是为了得到 i divarray className 这个未定义的值。

        3
  •  1
  •   sirhc    15 年前

    var divarray = [];
    var articleHTML = [];
    var absHTML;
    var keyHTML;
    var bodyHTML = [];
    var i = 0;
    divarray = document.getElementById("yui-main").getElementsByTagName("div");
    for ( var j in divarray) {
        if(divarray[j].className == "articleBody"){
            alert("found");
            articleHTML = divarray[j];
            break;
        }
        bodyHTML[i] = '';
        if(divarray[j].className == "issueMiniFeature"){continue;}
        if(divarray[j].className == "abstract"){absHTML = divarray[j]; continue;}
        if(divarray[j].className == "journalKeywords"){keyHTML = divarray[j]; continue;}
        bodyHTML[i] = divarray[j];
        i++;
    }