作者: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; // => trueparagraph instanceof HTMLElement; // => true
简略地说,元素是节点的子类型,就像猫是动物的子类型一样。
3. DOM属性:节点和元素
除了辨别节点和元素之外,还须要辨别只蕴含节点或只蕴含元素的DOM属性。
节点类型的以下属性评估为一个节点或节点汇合(NodeList
):
node.parentNode; // Node or nullnode.firstChild; // Node or nullnode.lastChild; // Node or nullnode.childNodes; // NodeList
然而,以下属性是元素或元素汇合(HTMLCollection
):
node.parentElement; // HTMLElement or nullnode.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和欠缺,大家面试能够参照考点温习,另外关注公众号,后盾回复福利,即可看到福利,你懂的。