Dom 節(jié)點和 元素 有啥區(qū)別?好家伙,我弄懂了!
本文已經(jīng)過原作者 Shadeed 授權(quán)翻譯。
DOM 還使用術(shù)語元素(Element)它與節(jié)點非常相似。那么,DOM節(jié)點和元素之間有什么區(qū)別呢?
1. DOM節(jié)點
理解節(jié)點和元素之間區(qū)別的關(guān)鍵是理解節(jié)點是什么。
更高的角度來看,DOM文檔由節(jié)點層次結(jié)構(gòu)組成。每個節(jié)點可以具有父級和/或子級。
看看下面的HTML文檔:
- <!DOCTYPE html>
- <html>
- <head>
- <title>My Page</title>
- </head>
- <body>
- <!-- Page Body -->
- <h2>My Page</h2>
- <p id="content">Thank you for visiting my web page!</p>
- </body>
- </html>
該文檔包含以下節(jié)點層次結(jié)構(gòu):
<html>是文檔樹中的一個節(jié)點。它有2個子節(jié)點:<head>和<body>。
<body>子有3個子節(jié)點的節(jié)點:注釋節(jié)點 <!-- Page Body -->,標(biāo)題<h2>,段落<p>。<body>節(jié)點的父節(jié)點是<html>節(jié)點。
HTML文檔中的標(biāo)記代表一個節(jié)點,有趣的是普通文本也是一個節(jié)點。段落節(jié)點<p>有1個子節(jié)點:文本節(jié)點“Thank you for visiting my web page!”。
1.2節(jié)點類型
我們要如何區(qū)分這些不同類型的節(jié)點?答案在于DOM Node接口,尤其是Node.nodeType屬性。
Node.nodeType可以具有代表節(jié)點類型的以下值之一:
- Node.ELEMENT_NODE
- Node.ATTRIBUTE_NODE
- Node.TEXT_NODE
- Node.CDATA_SECTION_NODE
- Node.PROCESSING_INSTRUCTION_NODE
- Node.COMMENT_NODE
- Node.DOCUMENT_NODE
- Node.DOCUMENT_TYPE_NODE
- Node.DOCUMENT_FRAGMENT_NODE
- Node.NOTATION_NODE
常量有意義地指示節(jié)點類型:例如Node.ELEMENT_NODE代表元素節(jié)點,Node.TEXT_NODE代表文本節(jié)點,Node.DOCUMENT_NODE文檔節(jié)點,依此類推。
例如,讓我們選擇段落節(jié)點,然后查看其nodeType屬性:
- const paragraph = document.querySelector('p');
- paragraph.nodeType === Node.ELEMENT_NODE; // => true
代表整個節(jié)點文檔樹的節(jié)點類型為Node.DOCUMENT_NODE:
- document.nodeType === Node.DOCUMENT_NODE; // => true
2. DOM元素
掌握了DOM節(jié)點的知識之后,現(xiàn)在該區(qū)分DOM節(jié)點和元素了。
如果你了解節(jié)點術(shù)語,那么答案是顯而易見的:元素是特定類型的節(jié)點 element (Node.ELEMENT_NODE),以及文檔、注釋、文本等類型。
簡而言之,元素是使用HTML文檔中的標(biāo)記編寫的節(jié)點。<html>,<head>,<title>,<body>,<h2>,<p>都是元素,因為它們由標(biāo)簽表示。
文檔類型,注釋,文本節(jié)點不是元素,因為它們沒有使用標(biāo)簽編寫:
Node是節(jié)點的構(gòu)造函數(shù),HTMLElement 是 JS DOM 中元素的構(gòu)造函數(shù)。段落既是節(jié)點又是元素,它同時是Node和HTMLElement的實例
- const paragraph = document.querySelector('p');
- paragraph instanceof Node; // => true
- paragraph instanceof HTMLElement; // => true
3. DOM屬性:節(jié)點和元素
除了區(qū)分節(jié)點和元素之外,還需要區(qū)分只包含節(jié)點或只包含元素的DOM屬性。
節(jié)點類型的以下屬性評估為一個節(jié)點或節(jié)點集合(NodeList):
- node.parentNode; // Node or null
- node.firstChild; // Node or null
- node.lastChild; // Node or null
- node.childNodes; // NodeList
但是,以下屬性是元素或元素集合(HTMLCollection):
- node.parentElement; // HTMLElement or null
- node.children; // HTMLCollection
由于node.childNodes和node.children都返回子級列表,因此為什么要同時具有這兩個屬性?好問題!
考慮以下包含某些文本的段落元素:
- <p>
- <b>Thank you</b> for visiting my web page!
- </p>
打開演示,然后查看parapgraph節(jié)點的childNodes和children屬性:
- const paragraph = document.querySelector('p');
- paragraph.childNodes; // NodeList: [HTMLElement, Text]
- paragraph.children; // HTMLCollection: [HTMLElement]
paragraph.childNodes集合包含2個節(jié)點:<b>Thank you</b>,,以及for visiting my web page!文本節(jié)點!
但是,paragraph.children集合僅包含1個項目:<b>Thank you</b>。
由于paragraph.children僅包含元素,因此此處未包含文本節(jié)點,因為其類型是文本(Node.TEXT_NODE),而不是元素(Node.ELEMENT_NODE)。
同時擁有node.childNodes和node.children,我們可以選擇要訪問的子級集合:所有子級節(jié)點或僅子級是元素。
4.總結(jié)
DOM文檔是節(jié)點的分層集合,每個節(jié)點可以具有父級和/或子級。如果了解節(jié)點是什么,那么了解DOM節(jié)點和元素之間的區(qū)別就很容易。
節(jié)點有類型,元素類型就是其中之一,元素由HTML文檔中的標(biāo)記表示。
完~ 我是小智,我要去刷碗了,我們下期再見!
作者:Shadeed 譯者:前端小智 來源:dmitripavlutin
原文:https://dmitripautin.com/dom-node-element/
本文轉(zhuǎn)載自微信公眾號「 大遷世界」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 大遷世界公眾號。