2010-05-18 75 views
1

這段代碼有什麼問題?代碼不起作用,無法讀取undefined屬性'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[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 

我使用谷歌瀏覽器。

+1

你應該使用'divarray [j]'而不是'divarray [i]'。 – sirhc 2010-05-18 19:28:23

回答

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

與陣列。

+0

當我注意到代碼是多麼古怪時,我刪除了原來的答案。 – ChaosPandion 2010-05-18 19:32:00

+0

我的意思是成爲一個foreach。我的,我今天都混在一起了! – 2010-05-18 19:36:25

+0

我後來發現我有正確的想法,但做錯了。 – 2010-05-22 18:11:30

1

您是不是要找:

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

忘記它吧,我只會用更新的代碼打開一個新問題。 – 2010-05-18 19:42:32

2

您初始化articleHTML爲數組,那麼你顯然設置articleHTML到HTML元素(divarray[i]),但是,隨後處理它像一個數組(articleHTML[i]) - 這實際上是嘗試獲取您從divarray(不存在)中取出的HTMLElement的i屬性,然後嘗試獲取此未定義值的className