2012-08-22 18 views
3

我在外部.js文件這個javascript函數:在專用的html頁面即使數組長度爲1,傳遞三次循環的速記?

function init() { 
var v = document.getElementsByTagName('video'),i; 
console.log(v.length); 
    for (i in v) { 
console.log("class:" + v[i].className + "id:" + v[i].id); 
} 
} 
init(); 

和一個視頻元素。這是腳本返回到Chrome控制檯的原因:

1  // v.length 
class:video1id:bigBunny //first pass of for loop 
class:undefinedid:undefined  //?? 
class:undefinedid:undefined  //?? 

爲什麼會發生這種情況?

回答

8

一個NodeList(由getElementsByTagName返回)不僅具有元素,但兩個附加屬性:

length (the amount of elements) 
item  (to get an element, basically the same as using [i] notation) 

你迭代他們以及和處理,就好像它們是元素。他們不是;他們沒有班級也沒有ID。您應該使用數字for循環(for(var i = 0; i < v.length; i++)。這(不像for in)顯然不能包含這樣的屬性。

+0

哦,我的壞,我認爲它返回的元素數組,我的代碼有道理,非常感謝。 – wazzup

+2

@wazzup:甚至一個數組可以具有除索引之外的其他屬性。在這種情況下,建議不要使用'for in'。 – pimvdb

1

無論如何,你應該真的使用傳統的循環。

for(var i = 0; i < v.length; i++) 
{ 
    console.log("class:" + v[i].className + "id:" + v[i].id); 
} 
+0

不幸的是,'for in'循環確實爲您提供了鍵值而非值。 – pimvdb

+0

@pimvdb哦...廢話,你說得對。不知道 - 以前從未使用過:P –

相關問題