2010-05-18 3 views
1

Quel est le problème avec ce code?Le code ne fonctionne pas, impossible de lire la propriété 'className' de undefined

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.

+1

Vous devriez utiliser 'divarray [j]' au lieu de 'divarray [i]'. – sirhc

Répondre

3

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 monterons array.length + 2 au lieu de array.length - 1. Puisque array[array.length + 2] n'existe pas, il renverra undefined et lancera l'erreur lorsque vous essaierez d'accéder à une propriété de celui-ci.


Juste toujours utiliser

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

avec des tableaux.

+0

J'ai supprimé ma réponse originale une fois que j'ai remarqué à quel point le code était bizarre. – ChaosPandion

+0

Je voulais dire que c'était une foreach. Mon, je suis tout mélangé aujourd'hui! –

+0

J'ai découvert plus tard que j'avais la bonne idée, mais je me trompais. –

1

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

l'oublier, je vais juste ouvrir une nouvelle question avec le code mis à jour. –

2

INITIALISATION articleHTML comme un tableau, alors vous configurez apparemment articleHTML à un HTMLElement (divarray[i]) mais le traiter comme un tableau (articleHTML[i]) - ce essaie réellement obtenir la propriété i du HTMLElement que vous avez extrait de divarray, qui n'existe pas, puis vous essayez d'obtenir le className de cette valeur indéfinie.

Questions connexes