开发者问题收集

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

2010-05-18
11867

此代码有什么问题?

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

我正在使用 Google Chrome。

3个回答

您使用的循环非常奇怪。

 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) {
  ...
}

数组即可。

kennytm
2010-05-18

您将 articleHTML 初始化为一个数组,然后您显然将 articleHTML 设置为 HTMLElement ( divarray[i] ),但随后将其视为一个数组 ( articleHTML[i] ) — 这实际上会尝试获取您从 divarray 中拉出的 HTMLElement 的 i 属性,但该属性并不存在,然后您尝试获取这个未定义值的 className

Chuck
2010-05-18

您的意思是:

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++;
}
sirhc
2010-05-18