Код не работает, не может прочитать свойство 'className' из неопределенного - PullRequest
1 голос
/ 18 мая 2010

Что не так с этим кодом?

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 ]

3 голосов
/ 18 мая 2010

Вы используете очень странный цикл.

 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 голосов
/ 18 мая 2010

Вы инициализируете articleHTML как массив, затем вы, очевидно, устанавливаете articleHTML в HTMLElement (divarray[i]), но затем обрабатываете его как массив (articleHTML[i]) - это на самом деле пытается получить i свойство HTMLElement, которое вы извлекли из divarray, которого не существует, и затем вы пытаетесь получить className этого неопределенного значения.

1 голос
/ 18 мая 2010

Вы имели в виду:

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++;
}
...