Code ne fonctionne pas, ne peut pas lire la propriété « className » undefined
-
30-09-2019 - |
Question
Quel est le problème avec ce code?
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++;
}
L'erreur que je reçois est:
TypeError: Cannot read property 'className' of undefined
J'utilise Google Chrome.
La solution
Vous utilisez une boucle très étrange.
for (var j in array) {
// use array[i]
++ i
}
Le problème est .getElementsByTagName
ne retourne pas un tableau, mais une interface semblable à un tableau. Par exemple:
>>> for (var j in document.getElementsByTagName('body')) console.log(j)
0
length
item
namedItem
Par conséquent, dans votre boucle for
/ in
, i
ira jusqu'à array.length + 2
au lieu de array.length - 1
. Étant donné que array[array.length + 2]
n'existe pas, il retournera undefined
et jeter l'erreur lorsque vous essayez d'accéder à une propriété de celui-ci.
Il suffit de toujours utiliser
for (var i = 0, len = array.length; i < len; ++ i) {
...
}
avec des tableaux.
Autres conseils
Vous initialisez articleHTML
comme un tableau, alors vous configurez apparemment articleHTML
à un HTMLElement (divarray[i]
) mais le traiter comme un tableau (articleHTML[i]
) - ce essaie effectivement d'obtenir la propriété i
du HTMLElement que vous avez tiré sur divarray
, qui n'existe pas, et vous essayez d'obtenir le className
de cette valeur non définie.
Vouliez-vous dire:
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++;
}