Element和Node的區(qū)別你造嗎?

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,TextComment都繼承于它。
換句話說,ElementTextComment是三種特殊的Node,它們分別叫做ELEMENT_NODE,
TEXT_NODECOMMENT_NODE。

所以我們平時使用的html上的元素,即Element是類型為ELEMENT_NODENode

利用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。

就像NodeListNode的集合一樣,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圖,此刻再看這張圖是不是覺得回味無窮咧。

參考資料:

1.Node vs Element

2.DOM

3.Node

4.NodeList

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本章內(nèi)容 理解包含不同層次節(jié)點的 DOM 使用不同的節(jié)點類型 克服瀏覽器兼容性問題及各種陷阱 DOM 是針對 HT...
    悶油瓶小張閱讀 777評論 0 1
  • 節(jié)點層次 DOM 可以將任何 HTML 和 XML 文檔描繪成一個由多層節(jié)點構(gòu)成的結(jié)構(gòu)。節(jié)點分為幾種不同的類型,每...
    云之外閱讀 583評論 0 1
  • 一、基本概念 1.1、DOM DOM是JS操作網(wǎng)頁的接口,全稱為“文檔對象模型”(Document Object ...
    周花花啊閱讀 3,440評論 0 6
  • 前兩天,大學一位玩得很好的舍友打電話過來說:“他有個朋友想學網(wǎng)頁設(shè)計要我?guī)?。于是就加了Q,聊了下。跟他聊的過...
    朝夕熊閱讀 327評論 0 0
  • 每一次從門里出去時,都報有滿滿的希望,而這些希望也在生活中豐富了生命的內(nèi)容。我從不猶豫自己的決心,卻總在轉(zhuǎn)彎的地方...
    我是朝朝爸閱讀 320評論 0 0

友情鏈接更多精彩內(nèi)容