2015-08-20 94 views
1

我使用創建數組:2種不同長度的數組?

var links = document.getElementsByTagName('a'); 

如果我做的:

console.log(links.length); 

我得到:2

但是,如果我這樣做:

console.log(links); 

我得到一個看起來像這樣的對象:

[a.elm-skip-link,a]

當我展開這個對象時,其中有33個鏈接對象。

爲什麼鏈接對象的長度會改變?如果它是一個數組,它不會保留創建時的大小嗎?

這裏是我正在使用的代碼:

var links = document.getElementsByTagName('a'); 
console.log('links:'); 
console.log(links); 
console.log('length:'); 
console.log(links.length); 

BTW:我想選擇不會有一個「id」或「類」屬性頁面上的特定鏈接,這樣我需要獲取所有鏈接,然後循環查找具有我要查找的「標題」屬性的鏈接。但是,當我試圖循環訪問這個「鏈接」對象時,循環只運行兩次,儘管頁面上有33個鏈接。

+0

首先,這不是一個數組,它是[節點列表](https://developer.mozilla.org/en-US/docs/Web/API/NodeList) – WhiteHat

+1

只是一個註釋:有一個*文檔。鏈接*集合即頁面中的所有鏈接。一個元素不一定是鏈接。此外,[* getElementsByTagName *](http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-A6C9094)會返回一個[* NodeList *](http:// www。 w3.org/TR/DOM-Level-3-Core/core.html#ID-536297177),而不是數組。 – RobG

+0

由於HTMLCollection(我不知道)的行爲,此問題不是console.log同步或異步問題的重複。我知道console.log不是異步的,但我不知道HTMLCollection對象的特殊行爲。 –

回答

3

getElementsByTagName實際上並沒有返回一個數組,它返回的是一個類似於對象的數組,它是活的HTMLCollection

現實的意思是,任何時候DOM被修改,集合(或返回的數組像對象)被修改。所以,如果我不得不冒險猜測,我會假設你的DOM沒有完全加載,當你運行第一次調用這個函數。它返回的集合僅包含兩個元素,並且它們被髮送到控制檯。後來,當您在該集合上展開時,DOM已被修改,並且您會看到最終的33個元素。

+0

我不知道實時HTMLCollection對象。這是問題。我在document.ready間隔中封裝了我的調用,並且它正常工作。謝謝! –