DOM节点和元素之间的区别是什么? |
您所在的位置:网站首页 › js中元素和节点的区别 › DOM节点和元素之间的区别是什么? |
代码语言:javascript复制// 每日前端夜话 第469篇
// 正文共:1000 字
// 预计阅读时间:7 分钟
![]() 文档对象模型(DOM)是将 HTML 或 XML 文档视为树结构的接口,其中每个节点(node)都是文档的对象。DOM 还提供了一组用于查询树、修改结构和样式的方法。 DOM 还使用了术语 元素(element):它与节点非常相似。那么 DOM 节点和元素之间有什么区别呢? DOM 节点要理解它们区别,关键是理解节点是什么。 从更高的角度来看,DOM 文档是由节点层次结构组成。每个节点可以有父级或子级节点。 看一下这个 HTML 文档: 代码语言:javascript复制 My Page My PageThank you for visiting my web page! 这个文档包含以下节点层次结构: ![]() DOM节点层次结构 是文档树中的一个节点。它有2个子节点: 和 。 是一个有 3 个子节点的节点:注释 ,标题 和段落 。 节点的父节点是 节点。 HTML 文档中的标签代表一个节点,常规文本也是一个节点。段落节点 有1个子节点为文本节点:"Thank you for visiting my web page!"。 节点类型那么怎样区分这些节点的类型呢?答案在于 DOM Node 接口,尤其是在 Node.nodeType 属性中。 Node.nodeType 的值可以是以下列表中的一个,这个值代表了节点的类型: Node.ELEMENT_NODENode.ATTRIBUTE_NODENode.TEXT_NODENode.CDATA_SECTION_NODENode.PROCESSING_INSTRUCTION_NODENode.COMMENT_NODENode.DOCUMENT_NODENode.DOCUMENT_TYPE_NODENode.DOCUMENT_FRAGMENT_NODENode.NOTATION_NODE这些常量指示了节点类型:例如:Node.ELEMENT_NODE 代表元素节点,Node.TEXT_NODE 代表文本节点,Node.DOCUMENT_NODE 代表文档节点等。 例如选择段落节点,然后查看其 nodeType 属性: 代码语言:javascript复制const paragraph = document.querySelector('p'); paragraph.nodeType === Node.ELEMENT_NODE; // => true和我们想的一样,paragraph.nodeType 的值为 Node.ELEMENT_NODE,指示该段落是一个元素。 它还包含一个文本节点: 代码语言:javascript复制const paragraph = document.querySelector('p'); const firstChild = paragraph.childNodes[0]; firstChild.nodeType === Node.TEXT_NODE; // => trueNode.DOCUMENT_NODE 类型代表整个节点的文档树: 代码语言:javascript复制document.nodeType === Node.DOCUMENT_NODE; // => true DOM元素掌握了DOM节点的知识之后,现在该区分 DOM 节点和元素了。 如果你理解了什么事节点,那么答案很明显:元素是特定类型的节点——Node.ELEMENT_NODE以及文档、注释、文本等类型。 简单的说,元素是使用 HTML 文档中的标记编写的节点。、、、、、 都是元素,因为它们是用标签表示的。 文档类型、注释、文本节点不是元素,因为它们不是用标签编写的: 代码语言:javascript复制Thank you for visiting my web page! 节点的构造函数是 Node,HTMLElement 是 JavaScript DOM 中元素的构造函数。段落既是节点又是元素,是 Node 和 HTMLElement 的实例: 代码语言:javascript复制const paragraph = document.querySelector('p'); paragraph instanceof Node; // => true paragraph instanceof HTMLElement; // => true简单的说,元素是节点的子类型,就像猫是动物的子类型一样。 DOM属性:节点和元素除了区分节点和元素外,还需要区分仅包含节点或仅包含元素的 DOM 属性。 Node 类型的以下属性被认为是一个节点或节点集合(NodeList): 代码语言:javascript复制node.parentNode; // Node or null node.firstChild; // Node or null node.lastChild; // Node or null node.childNodes; // NodeList但是,以下属性是元素或元素集合(HTMLCollection): 代码语言:javascript复制node.parentElement; // HTMLElement or null node.children; // HTMLCollectionnode.childNodes 和 node.children 都返回一个子列表,问题来了:为什么要存在这两个相似的属性? 先来看下面包含某些文本的段落元素: 代码语言:javascript复制Thank you for visiting my web page! 查看 parapgraph 节点的 childNodes 和 children 属性: 代码语言:javascript复制const paragraph = document.querySelector('p'); paragraph.childNodes; // NodeList: [HTMLElement, Text] paragraph.children; // HTMLCollection: [HTMLElement]paragraph.childNodes 集合包含 2 个节点:粗体元素 Thank you,以及文本节点for visiting my web page!。 但是 paragraph.children 集合仅包含1个项目:粗体元素 Thank you。 由于 paragraph.children 仅包含元素,所以这里没有包含文本节点,因为其类型是文本(Node.TEXT_NODE),而不是元素(Node.ELEMENT_NODE)。 同时拥有 node.childNodes 和 node.children,你可以选择要访问的子级集合:是所有子级节点还是只有是元素的子级。 总结DOM 文档是节点的分层集合。每个节点可以有父级或子级。 如果了解了什么是节点,那么了解 DOM 节点和元素之间的区别就很容易。 节点具有类型,元素类型是其中之一。元素由 HTML 文档中的标签表示。 最后考考你:哪种类型的节点永远没有父节点? |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |