1.寫在前面
我們經(jīng)常使用document.getElementById去獲取DOM中的元素消玄,也會使用childNodes來獲取子節(jié)點薯演。那么Element和Node的區(qū)別是什么撞芍?而什么又是HTMLCollection,HTMLElement,和NodeList呢?
一個簡單的頁面:
<html>
<body>
<h1>China</h1>
<!-- My comment ... -->
<p>China is a popular country with...</p>
<div>
<button>See details</button>
</div>
</body>
</html>
body
里的直系子元素一共有三個:h
,p
,div
跨扮。我們可以用document.body.childNodes
查看, 結(jié)果如下:
問題來了:
- 1.這么會有這么多的#text序无?
- 2.注釋算節(jié)點?
在回答上面兩個問題之前衡创,就有必要理解下什么是Node
了帝嗡。
2.Node vs Elemet
以下摘自MDN:
A Node is an interface from which a number of DOM types inherit, and allows these various types to be treated (or tested) similarly.
The following interfaces all inherit from Node its methods and properties: Document, Element, CharacterData (which Text, Comment, and CDATASection inherit), ProcessingInstruction, DocumentFragment, DocumentType, Notation, Entity, EntityReference.
簡單的說就是Node
是一個基類,DOM中的Element
璃氢,Text
和Comment
都繼承于它哟玷。
換句話說,Element
一也,Text
和Comment
是三種特殊的Node
巢寡,它們分別叫做ELEMENT_NODE
,
TEXT_NODE
和COMMENT_NODE
喉脖。
所以我們平時使用的html上的元素,即Element是類型為ELEMENT_NODE
的Node
抑月。
利用nodeType
可以查看所有類型树叽,如下圖:
到這里,我想我們就可以解釋上面兩個問題了谦絮。
實際上Node
表示的是DOM樹的結(jié)構(gòu)题诵,在html中,節(jié)點與節(jié)點之間是可以插入文本的挨稿,這個插入的空隙就是TEXT_NODE
仇轻,即:
<body>
we can put text here 1...
<h1>China</h1>
we can put text here 2...
<!-- My comment ... -->
we can put text here 3...
<p>China is a popular country with...</p>
we can put text here 4...
<div>
<button>See details</button>
</div>
we can put text here 5 ...
</body>
這下就順理成章了,body的直系元素(3)+ COMMENT_NODE(1) + TEXT_NODE(5) = 9
3.NodeList vs HTMLCollection
我們用childNodes
找到了NodeList
奶甘,但我們操作DOM時往往不想操作Node
(我只想操作元素Element)篷店,那么如何獲取ElementList呢?
其實我們經(jīng)常使用的getElementsByXXX
返回的就是一個ElementList臭家,只不過它的真實名字是ElementCollection
疲陕。
就像NodeList
是Node
的集合一樣,ElementCollection
也是Element
的集合钉赁。但需要特別注意的是:
NodeList和ElementCollcetion都不是真正的數(shù)組
如果document.getElementsByTagName('a') instanceof Array
蹄殃,那么必然是false
。
4.寫在最后
DOM(Document Object Model)簡稱文檔對象模型你踩,它是html和xml是文檔編程的接口诅岩,它將文檔解析為樹結(jié)構(gòu),這個樹的根部就是document
,而document
的第一個子節(jié)點(childeNodes[0])就是html带膜,這才有了后面的一系列html元素吩谦。
最后附一張DOM圖,此刻再看這張圖是不是覺得回味無窮咧膝藕。
參考資料:
2.DOM
3.Node
4.NodeList