介紹
在js的dom操作中,除了常用的document、**Element之外,還有三個集合對象,即HTMLCollection、NodeList以及NamedNodeMap。試看以下操作:
複製代碼
1 var divs = document.getElementsByTagName("div");
2 alert(divs instanceof HTMLCollection); //true (chrome中返回false,divs是NodeList對象)
3
4 var div = document.getElementById("div1");
5
6 var children = div.childNodes; //獲取div元素子節點集合
7 alert(children instanceof NodeList); //true
8
9 var attrs = div.attributes; //獲取div元素的特性
10 alert(children instanceof NamedNodeMap); //true
複製代碼
以上代碼中,chrome下的document.getElementsByTagName("div")將返回NodeList對象。
這三個對象都是「類數組」,可以獲取他們的length,也可以通過 attrs[0] 獲取數據,有點類似與函數裡面的arguments。
NamedNodeMap和Attr
div.attrbutes將返回一個NamedNodeMap對象,即NamedNodeMap存儲是的div的「特性Attribute」集合。而集合中的每一個元素,都是Attr類型的對象。Attr對象有三個屬性,name、value和specified。
但是在日常應用中,一般會應用getAttribute、setAttribute和romoveAttribute來操作特性,不需要直接訪問特性對象。
另外,dom元素的「特性」(Attribute)和「屬性」(property)是不一樣的,兩者要分清楚,我會在以後的文章中專門講解。
所謂「動態」
HTMLCollection、NodeList以及NamedNodeMap這三個集合都是「動態的」,每當文檔發生變化時,他們都會更新。他們將始終保持這最新、最準確的消息。且看以下程序:
複製代碼
var divs = document.getElementsByTagName("div"),
i,
div;
for (i = 0; i < divs.length; i++) {
div = document.createElement("div");
document.body.appendChild(div);
}
複製代碼
以上代碼是個死循環!
為何?就因為divs是通過getElementsByTagName獲取的htmlCollection集合,它是「動態」的。每次執行document.body.appendChild(div)時候,divs.length都會增加。
總結
1. 要了解 HTMLCollection、NodeList以及NamedNodeMap 三種集合類型;
2. 他們都是「類數組」;
3. 知道他們的「動態性」,這個很重要;
4. 特性和屬性不同,後續會專門講解。