Код не работает, не могу прочитать свойство «ClassName» undefined

StackOverflow https://stackoverflow.com/questions/2860370

Вопрос

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

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.

Это было полезно?

Решение

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

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

с массивами.

Другие советы

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

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

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++;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top