前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DOM节点和元素之间的区别是什么?

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

作者头像
疯狂的技术宅
发布于 2021-01-28 02:44:23
发布于 2021-01-28 02:44:23
2.5K00
代码可运行
举报
文章被收录于专栏:京程一灯京程一灯
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 每日前端夜话 第469篇
// 正文共:1000 字
// 预计阅读时间:7 分钟

文档对象模型(DOM)是将 HTML 或 XML 文档视为树结构的接口,其中每个节点(node)都是文档的对象。DOM 还提供了一组用于查询树、修改结构和样式的方法。

DOM 还使用了术语 元素(element):它与节点非常相似。那么 DOM 节点和元素之间有什么区别呢?

DOM 节点

要理解它们区别,关键是理解节点是什么。

从更高的角度来看,DOM 文档是由节点层次结构组成。每个节点可以有父级或子级节点。

看一下这个 HTML 文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!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>

这个文档包含以下节点层次结构:

DOM节点层次结构

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

<body> 是一个有 3 个子节点的节点:注释 <!-- Page Body -->,标题 <h2> 和段落 <p><body> 节点的父节点是 <html> 节点。

HTML 文档中的标签代表一个节点,常规文本也是一个节点。段落节点 <p> 有1个子节点为文本节点:"Thank you for visiting my web page!"

节点类型

那么怎样区分这些节点的类型呢?答案在于 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 属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const paragraph = document.querySelector('p');

paragraph.nodeType === Node.ELEMENT_NODE; // => true

和我们想的一样,paragraph.nodeType 的值为 Node.ELEMENT_NODE,指示该段落是一个元素。

它还包含一个文本节点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const paragraph = document.querySelector('p');
const firstChild = paragraph.childNodes[0];

firstChild.nodeType === Node.TEXT_NODE; // => true

Node.DOCUMENT_NODE 类型代表整个节点的文档树:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.nodeType === Node.DOCUMENT_NODE; // => true

DOM元素

掌握了DOM节点的知识之后,现在该区分 DOM 节点和元素了。

如果你理解了什么事节点,那么答案很明显:元素是特定类型的节点——Node.ELEMENT_NODE以及文档、注释、文本等类型。

简单的说,元素是使用 HTML 文档中的标记编写的节点。<html><head><title><body><h2><p> 都是元素,因为它们是用标签表示的。

文档类型、注释、文本节点不是元素,因为它们不是用标签编写的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <!DOCTYPE html><html>
  <body>
    <!-- Page Body -->    <p>
      Thank you for visiting my web page!    </p>
  </body>
</html>

节点的构造函数是 NodeHTMLElement 是 JavaScript DOM 中元素的构造函数。段落既是节点又是元素,是 NodeHTMLElement 的实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const paragraph = document.querySelector('p');

paragraph instanceof Node;        // => true
paragraph instanceof HTMLElement; // => true

简单的说,元素是节点的子类型,就像猫是动物的子类型一样。

DOM属性:节点和元素

除了区分节点和元素外,还需要区分仅包含节点或仅包含元素的 DOM 属性。

Node 类型的以下属性被认为是一个节点或节点集合(NodeList):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node.parentNode; // Node or null

node.firstChild; // Node or null
node.lastChild;  // Node or null

node.childNodes; // NodeList

但是,以下属性是元素或元素集合(HTMLCollection):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node.parentElement; // HTMLElement or null

node.children;      // HTMLCollection

node.childNodesnode.children 都返回一个子列表,问题来了:为什么要存在这两个相似的属性?

先来看下面包含某些文本的段落元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>
  <b>Thank you</b> for visiting my web page!
</p>

查看 parapgraph 节点的 childNodeschildren 属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.childNodesnode.children,你可以选择要访问的子级集合:是所有子级节点还是只有是元素的子级。

总结

DOM 文档是节点的分层集合。每个节点可以有父级或子级。

如果了解了什么是节点,那么了解 DOM 节点和元素之间的区别就很容易。

节点具有类型,元素类型是其中之一。元素由 HTML 文档中的标签表示。

最后考考你:哪种类型的节点永远没有父节点?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端先锋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
子网掩码是怎么“掩”的?用积木教你彻底搞懂!
你是不是也曾被“子网掩码”这个术语搞得晕头转向?明明是学网络的第一步,却像是打开了数学世界的大门:255、掩码、与运算、CIDR……
神的孩子都在歌唱
2025/04/23
1340
子网掩码是怎么“掩”的?用积木教你彻底搞懂!
彻底澄清子网掩码、反掩码、通配符掩码以及ospf network命令误区
示例1:deny ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255
全栈程序员站长
2022/09/09
2.6K1
彻底澄清子网掩码、反掩码、通配符掩码以及ospf network命令误区
子网掩码,反掩码与通配符之间的区别
1:子网掩码与反掩码的区别: 反掩码就是通配符掩码 通过标记0和1告诉设备应该匹配到哪位copy。 由于跟子网掩码刚好相zd反,所以也叫反掩码 例如掩码是255.255.255.0 wildcard-mask 就是0.0.0.255 255.255.255.248 反掩就是0.0.0.7 2:通配符掩码,ospf和Acl这儿用通配符掩码也不是每家的交换机都这么做,像cisco 3550就是用的子网掩码,所以不是一定的。
全栈程序员站长
2022/09/09
1.2K0
学测——网络组建(试卷二)
网络搭建:请根据拓扑图选取设备,并按照试题要求对设备进行相应的配置。完成后,将3个设备配置信息按照SW1、RT1、RT2顺序粘贴至word文档,并以“网络搭建+考生姓名”命名保存至桌面;将模拟器中每个设备用write命令保存配置,然后将文件命名为“网络搭建+考生姓名”的pkt文件,保存至桌面。富士集团为了提升员工休息质量,近期将对食堂进行网络部署,为了方便管理,在RT1路由器上配置telnet远程管理该设备。Telent密码为:123,特权密码为:zjj。食堂被分配的是1个C类保留网段192.168.1.0/24,拓扑图如下图所示,IP地址规划表如下表所示。
用户7162790
2022/03/23
1.5K0
学测——网络组建(试卷二)
IP地址(分类)、子网掩码、网络号、主机号、子网号
IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信。我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”,而Internet中的路由器,就相当于电信局的“程控式交换机”。 IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)
全栈程序员站长
2022/09/12
9.4K0
IP地址(分类)、子网掩码、网络号、主机号、子网号
反掩码与通配符掩码[通俗易懂]
掩码我们学数通的应该都很熟悉,我们刚刚学习IP的时候肯定都学过,这里就不在叙述。
全栈程序员站长
2022/09/15
4.2K0
反掩码与通配符掩码[通俗易懂]
通配符掩码的计算
我不太清楚通配符掩码具体是怎么定义的,但是在大多数初学者的印象中通配符掩码就是子网掩码取反,在网上搜索了一下也没有什么具体解释,下面是摘自百度百科的解释:
全栈程序员站长
2022/09/15
6620
如何理解掩码、反掩码、通配符「建议收藏」
一、掩码 在掩码中,1表示精确匹配,0表示随机 1和0,永远不交叉; 1永远在左边,0永远在右边; 在配置IP地址以及路由的时候,会使用掩码; 二、反掩码 在反掩码中,1表示随机,0表示精确匹配 0和1,永远不交叉; 0永远在左边,1永远在右边; 在路由协议的配置中,通过network命令进行网段宣告时,会使用 三、通配符 在统配符中,1表示随机,0表示精确匹配 0和1的位置,没有任何的固定限制 可以连续,可以交叉 在ACL中,使用的通配符 通配符掩码表
全栈程序员站长
2022/09/09
3K0
计算机网络:一文带你了解子网掩码相关的知识
这篇文章作者主要分享什么是深度学习以及深度学习的原理特征,深度学习(Deep Learning)是机器学习的一个分支,旨在通过模拟人脑的神经网络结构来解决复杂的任务。深度学习通过多层神经网络,自动从数据中学习特征,避免了传统机器学习中手动特征工程的繁琐过程。
小明互联网技术分享社区
2024/12/09
1K0
计算机网络:一文带你了解子网掩码相关的知识
通配符掩码计算「建议收藏」
一,通配符掩码 1.通配符掩码的用途和结构 ①用途 通配符掩码(wildcard-mask)路由器使用的通配符掩码与源或目标地址一起来分辨匹配的地址范围,它与子网掩码不同。它不像子网掩码告诉路由器IP地址的哪一位属于网络号一样,通配符掩码告诉路由器为了判断出匹配,它需要检查IP地址中的多少位。 ②结构 通配符掩码中,0表示要检查的位,1表示不需要检查的位 通配符掩码中,可以用255.255.255.255表示所有IP地址,因为全为1说明32位中所有位都不需检查,此时可用any替代。而0.0.0.0的通配符则表示所有32位都必须要进行匹配,它只表示一个IP地址,可以用host表示。
全栈程序员站长
2022/09/15
1.7K0
网络协议(二):MAC地址、IP地址、子网掩码、子网和超网
计算工具:https://www.sojson.com/convert/subnetmask.html
冬天vs不冷
2025/01/21
3460
网络协议(二):MAC地址、IP地址、子网掩码、子网和超网
子网掩码的概念和作用
子网掩码的作用是将IP地址分成两个部分:网络地址和主机地址。网络地址用于标识网络,而主机地址用于标识主机。子网掩码是一个32位的二进制数字,其中所有网络位都是1,所有主机位都是0。子网掩码指示哪些位是网络位,哪些位是主机位。子网掩码可以用于判断两个设备是否属于同一网络。
玖叁叁
2023/04/27
1.9K0
子网划分题目与解析
【1】一公司原来使用192.168.1.0/24这个标准网络,现在想为公司的每个部门(共六个)单独配置一个子网,其中最大的部门要分配IPv4地址的数量不超过25个。求每个子网的 子网掩码、地址范围、网络地址和广播地址。 分析: 192.168.1.0/24 共有254个可用的IPv4 地址 现在要划分6个子网且最大子网地址数目不超过25个,也就是划分成8个子网,每个子网可用的IPv4地址最多30个,只使用其中的6个子网。
全栈程序员站长
2022/09/07
1.5K0
子网划分题目与解析
什么是子网掩码?超过254个ip地址如何设置子网掩码?
对于ip地址我们前面通过多次文章,大家都有一定的理解,不过通过的留言,有部分朋友还是对子网掩码、ip地址的网段有些疑问,那么今天我们一起来解下这方面的内容。
网络技术联盟站
2023/03/13
3.4K0
什么是子网掩码?超过254个ip地址如何设置子网掩码?
每日一题:什么是子网掩码
IP地址是一串32比特的数字,按照8比特(1字节)为1组分成4组,分别用十进制表示再用圆点隔开,
用户7685359
2020/08/21
1.3K0
如何计算子网掩码
本文提供视频讲解,详细见:(https://www.bilibili.com/video/BV1oT4y17745)
研究僧
2020/07/12
6.1K0
网络知识 ACL NAT IPv6
第1章 ACL 访问控制列表 访问控制表(Access Control List,ACL),又称存取控制串列,是使用以访问控制矩阵为基础的访问控制方法,每一个对象对应一个串列主体。 访问控制表描述每一
惨绿少年
2017/12/27
2.2K0
网络知识 ACL NAT IPv6
通配符和通配符掩码
  在路由器的配置中,经常出现通配符。和子网掩码一样,都是以“0”或“1”表示,不过与子网掩码所表示的意思却不一样。
全栈程序员站长
2022/09/15
1.7K0
子网掩码、广播地址、DNS和网关
子网掩码从字面上的理解就是一种子网的遮罩,也就是说单单从一个IP地址其实我们并不能够判断该地址的网络号与主机号是多少位。虽然我们知道A类、B类、C类地址有一个自己的区间范围,由此可以知道该类型网络的网络号与主机号是多少位,但这也是以子网掩码是默认值为前提的。
一头小山猪
2020/04/10
7.4K1
ip地址的组成(网络位+主机位)
根据不同的取值范围,IP地址可以分为五类;IP地址中的前5位用于标识IP地址的类别:
全栈程序员站长
2022/09/20
14.4K0
ip地址的组成(网络位+主机位)
推荐阅读
相关推荐
子网掩码是怎么“掩”的?用积木教你彻底搞懂!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验