作者:Shadeed
译者:前端小智
起源:dmitripavlutin
点赞再看 ,微信搜寻【大迁世界】,B 站关注【前端小智】 这个没有大厂背景,但有着一股向上踊跃心态人。本文
GitHub
https://github.com/qq44924588… 上曾经收录,文章的已分类,也整顿了很多我的文档,和教程材料。
最近开源了一个 Vue 组件,还不够欠缺,欢送大家来一起欠缺它,也心愿大家能给个 star 反对一下,谢谢各位了。
github 地址:https://github.com/qq44924588…
文档对象模型 (DOM) 是一个将 HTML 或 XML 文档视为树形构造的接口,其中每个节点都是文档的一个对象。DOM 还提供了一组办法来查问树、扭转构造、款式。
DOM 还应用术语 元素 (Element) 它与节点十分类似。那么,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>
。
<body>
子有 3 个子节点的节点: 正文节点 <!-- Page Body -->
,题目 <h2>
,段落<p>
。<body>
节点的父节点是 <html>
节点。
HTML 文档中的标记代表一个节点,乏味的是一般文本也是一个节点。段落节点 <p>
有 1 个子节点: 文本节点“Thank you for visiting my web page!”
。
1.2 节点类型
咱们要如何辨别这些不同类型的节点?答案在于 DOM Node 接口,尤其是 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
代表整个节点文档树的节点类型为Node.DOCUMENT_NODE
:
document.nodeType === Node.DOCUMENT_NODE; // => true
2. DOM 元素
把握了 DOM 节点的常识之后,当初该辨别 DOM 节点和元素了。
如果你理解节点术语,那么答案是不言而喻的: 元素是特定类型的节点 element (Node.ELEMENT_NODE)
,以及文档、正文、文本等类型。
简而言之,元素是应用 HTML 文档中的标记编写的节点。<html>
,<head>
,<title>
,<body>
,<h2>
,<p>
都是元素,因为它们由标签示意。
文档类型,正文,文本节点不是元素,因为它们没有应用标签编写:
Node
是节点的构造函数,HTMLElement
是 JS DOM 中元素的构造函数。段落既是节点又是元素,它同时是 Node
和HTMLElement
的实例
const paragraph = document.querySelector('p');
paragraph instanceof Node; // => true
paragraph instanceof HTMLElement; // => true
简略地说,元素是节点的子类型,就像猫是动物的子类型一样。
3. DOM 属性:节点和元素
除了辨别节点和元素之外,还须要辨别只蕴含节点或只蕴含元素的 DOM 属性。
节点类型的以下属性评估为一个节点或节点汇合(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 节点的 childNodes
和children
属性:
const paragraph = document.querySelector('p');
paragraph.childNodes; // NodeList: [HTMLElement, Text]
paragraph.children; // HTMLCollection: [HTMLElement]
paragraph.childNodes
汇合蕴含 2 个节点:<b>Thank you</b>
,,以及 for visiting my web page!
文本节点!
然而,paragraph.children
汇合仅蕴含 1 个我的项目:<b>Thank you</b>
。
因为 paragraph.children
仅蕴含元素,因而此处未蕴含文本节点,因为其类型是文本(Node.TEXT_NODE
),而不是元素(Node.ELEMENT_NODE
)。
同时领有 node.childNodes
和node.children
,咱们能够抉择要拜访的子级汇合:所有子级节点或仅子级是元素。
4. 总结
DOM 文档是节点的分层汇合,每个节点能够具备父级和 / 或子级。如果理解节点是什么,那么理解 DOM 节点和元素之间的区别就很容易。
节点有类型,元素类型就是其中之一,元素由 HTML 文档中的标记示意。
完~ 我是小智,我要去刷碗了,咱们下期再见!
代码部署后可能存在的 BUG 没法实时晓得,预先为了解决这些 BUG,花了大量的工夫进行 log 调试,这边顺便给大家举荐一个好用的 BUG 监控工具 Fundebug。
原文:https://dmitripautin.com/dom-…
交换
文章每周继续更新,能够微信搜寻「大迁世界」第一工夫浏览和催更(比博客早一到两篇哟),本文 GitHub https://github.com/qq449245884/xiaozhi 曾经收录,整顿了很多我的文档,欢送 Star 和欠缺,大家面试能够参照考点温习,另外关注公众号,后盾回复 福利,即可看到福利,你懂的。