DOM节点和元素之间有什么区别?

文档目标模型(DOM)是一个将HTML或XML文档视为树状结构的接口,其中每个节点是文档的一个目标。DOM还供给了一套方法来查询树状结构,改动结构,风格。

DOM还运用了元素这个术语:它与节点很类似。那么,DOM节点和元素之间有什么区别?让我们来找出答案

1.DOM节点

了解节点和元素之间的区别的关键是要了解什么是节点。

从更高的视点看,一个DOM文档由一个节点的层次结构组成。每个节点都能够有一个父节点和/或子节点。

让我们看一下下面这个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>

该文档包含以下层次结构的节点。

<html> 是文档树中的一个节点。它有2个孩子: <head><body>节点。

HTML文档中的标签代表一个节点,有趣的是,普通文本也是一个节点。阶段节点<p> 有一个子节点:文本节点"Thank you for visiting my web page!"

1.2 节点类型

你怎么能区别这些不同类型的节点呢?答案就在DOM节点接口中,特别是Node.nodeType 特点中。

Node.nodeType 能够有以下值之一,代表节点的类型:

  • 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

常数有意义地表明节点类型:例如,Node.ELEMENT_NODE 代表元素节点,Node.TEXT_NODE 代表文本节点,Node.DOCUMENT_NODE 是文档节点,等等。

例如,让我们选择阶段节点,并看看它的nodeType 特点。

const paragraph = document.querySelector('p');
paragraph.nodeType === Node.ELEMENT_NODE; // => true

正如预期的那样,paragraph.nodeType 的值是Node.ELEMENT_NODE ,表明该阶段是一个元素。

该段还包含一个文本节点。

const paragraph = document.querySelector('p');
const firstChild = paragraph.childNodes[0];
firstChild.nodeType === Node.TEXT_NODE; // => true

有一种节点类型表明整个文档树的节点 –Node.DOCUMENT_NODE

document.nodeType === Node.DOCUMENT_NODE; // => true

2.DOM元素

在很好地把握了什么是DOM节点之后,现在是区别DOM节点和元素的时候了。

假如你很好地把握了节点这个术语,那么答案是显而易见的:元素是一个特定类型的节点–元素(Node.ELEMENT_NODE)。还有像文档、谈论、文本等类型。

简略地说,一个元素是在HTML文档中运用标签写的一个节点。<html>,<head>,<title>,<body>,<h2>,<p> 都是元素,由于它们是用标签表明的。

文档类型、谈论、文本节点不是元素,由于它们不是用标签写的。

 <!DOCTYPE html>
<html>
  <body>
    <!-- Page Body -->
    <p>
      Thank you for visiting my web page!
    </p>
  </body>
</html>
const paragraph = document.querySelector('p');
paragraph instanceof Node;        // => true
paragraph instanceof HTMLElement; // => true

简略点说,元素是节点的一个子类型,就像猫是动物的一个子类型相同。

3.DOM特点:节点和元素

除了区别节点和元素之外,你还需要区别只包含节点或只包含元素的DOM特点。

以下是Node 类型的特点,评价为一个节点或一个节点的调集(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.childNodesnode.children 都返回一个孩子的列表,为什么有这两个特点?好问题!

考虑一下下面这个包含一些文本的阶段元素。

<p>
  <b>Thank you</b> for visiting my web page!
</p>

翻开演示,然后看一下parapgraph节点的childNodeschildren 特点。

const paragraph = document.querySelector('p');
paragraph.childNodes; // NodeList:       [HTMLElement, Text]
paragraph.children;   // HTMLCollection: [HTMLElement]

但是,paragraph.children 调集只包含1个项目:粗体元素<b>Thank you</b>

由于paragraph.children 只包含元素,文本节点没有包含在这里,由于它的类型是文本(Node.TEXT_NODE ),而不是元素(Node.ELEMENT_NODE )。

一起具有node.childNodesnode.children 让你能够选择你想拜访的子集:一切的子节点或许只要元素的子集。

4.4.总结

一个DOM文档是一个有层次的节点调集。每个节点都能够有一个父节点和/或子节点。

假如你了解什么是节点,了解DOM节点和元素之间的区别就很简单了。

节点有类型,元素类型是其中之一。元素在HTML文档中由一个标签表明。