JS节点操作(1) - 父节点,子节点,兄弟节点

article/2025/10/26 21:04:52

节点操作的作用

获取元素通常使用的两种方式:

1. 利用DOM提供的方法获取元素

  • document.getElementById()
  • document.getElementsByTagName()
  • document.querySelector() 等等
  • 逻辑性不强,繁琐

2. 利用节点层级关系获取元素

  • 利用父子兄弟节点关系获取元素
  • 逻辑性墙,但是兼容性稍差

这两种方法都可以获取元素,但是节点操作更简单。

获取节点

1. 父节点 

1.1 node.parentNode 返回的是距离最近的父节点

<body><div class="parent"><em class="child">JavaScript</em></div><script>var child = document.querySelector('.child');// 返回的是距离最近的父节点// 如果没有父节点则返回nullvar parent = child.parentNode;console.log(parent);</script>
</body>

以上代码输出结果为:

 返回了距离child最近的父节点。

2. 子节点

2.1 node.childNode 返回所有的子节点,包括所有的文本节点和元素节点

<body><ul><li>1</li><li>2</li><li>3</li><li>4</li></ul><script>var parent = document.querySelector('ul');// 返回所有的子节点 包括所有的文本节点和元素节点var lis = parent.childNodes;console.log(lis);</script>
</body>

以上代码输出结果为:

返回了包含文本节点在内的9个子节点。那么如果我们只想要元素节点怎么办呢?

2.2 node.children 返回所有子元素节点

<body><ul><li>1</li><li>2</li><li>3</li><li>4</li></ul><script>var parent = document.querySelector('ul');// children获取所有的子元素节点var lis = parent.children;console.log(lis);</script>
</body>

 以上代码输出结果为:

只返回了4个元素节点。

2.3 node.firstChildnode.lastChild 返回第一个和最后一个子节点,包括所有节点

<body><ul><li>1</li><li>2</li><li>3</li><li>4</li></ul><script>var parent = document.querySelector('ul');// 获取第一个/最后一个子节点 包括所有的文本节点和元素节点console.log(parent.firstChild);console.log(parent.lastChild);</script>
</body>

以上代码输出结果为:

返回了两个文本节点。那么如果我们只想要元素节点怎么办呢?

2.3 node.firstElementChildnode.lastElementChild 返回第一个和最后一个子元素节点,有兼容性问题

<body><ul><li>1</li><li>2</li><li>3</li><li>4</li></ul><script>var parent = document.querySelector('ul');// 获取第一个/最后一个子元素节点 有兼容性问题,IE9以上才支持console.log(parent.firstElementChild);console.log(parent.lastElementChild);</script>
</body>

以上代码输出结果为:

返回了第一个和最后一个子元素节点。然而这个方法有兼容性问题,IE9以上才支持。那么我们在日常开发中既想获取第一个和最后一个子元素节点又想兼顾兼容性,我们还有什么好办法呢?

2.4 开发中常用方法获取第一个和最后一个子元素节点

<body><ul><li>1</li><li>2</li><li>3</li><li>4</li></ul><script>var parent = document.querySelector('ul');// 实际开发中 利用childrenconsole.log(parent.children[0]);console.log(parent.children[parent.children.length - 1]);</script>
</body>

在实际开发中,我们可以运用children方法来返回第一个和最后一个子节点。

3. 兄弟节点

3.1 node.previousSibling 和 node.nextSibling 获取前一个和后一个兄弟节点,包括所有节点

<body><p>p</p><div class="div">div</div><span>span</span><script>var div = document.querySelector('div');// 获取兄弟节点-前一个/后一个节点 包含所有子节点// 找不到则返回nullconsole.log(div.nextSibling);console.log(div.previousSibling);</script>
</body>

以上代码输出结果为:

返回了div的前一个和后一个文本节点。那么如果我们只想要获取元素节点怎么办呢?

3.2 node.previousElementSibling 和 node.nextElementSibling 获取前一个和后一个兄弟元素节点,有兼容性问题

<body><p>p</p><div class="div">div</div><span>span</span><script>var div = document.querySelector('div');// 获取兄弟节点-前一个/后一个元素节点 有兼容性问题// 找不到则返回nullconsole.log(div.nextElementSibling);console.log(div.previousElementSibling);</script>
</body>

以上代码输出结果为:

返回了前一个和后一个元素节点。然而这个方法有兼容性问题,IE9以上才支持。那么我们在日常开发中既想获取前一个和后一个兄弟元素节点又想兼顾兼容性,我们还有什么好办法呢?

3.3 封装兼容性函数获取兄弟元素节点

以获取下一个元素节点为例: 

<body><p>p</p><div class="div">div</div><span>span</span><script>var div = document.querySelector('div');// 封装兼容性函数function getNextElementSibling(ele) {while (ele = ele.nextSibling) {if (ele.nodeType === 1) {return ele;}}return null;}console.log(getNextElementSibling(div));</script>
</body>

http://chatgpt.dhexx.cn/article/YHpGjGIE.shtml

相关文章

树中的重要概念

1 基本术语及定义 1.1 根节点 根节点&#xff1a;是树中唯一没有入边的节点。 1.2 父节点 父节点&#xff1a;一个节点是其所有子节点的父节点 1.3 子节点 子节点&#xff1a;一个节点通过出边与子节点相连 1.4 兄弟节点 兄弟节点&#xff1a;具有同一个父节点的节点称…

VScode 代码注释

MAC&#xff1a; 单行注释/取消注释&#xff1a; command/ 多行注释/取消注释&#xff1a; 1.选中要注释代码块command/ 2.optionshifta 3.JsDOc注释&#xff1a;/tab** 如下图所示 常用于给方法写注释&#xff0c;写在方法上时会自动带上此方法的参数&#xff0c;而且会车自…

说说代码中的注释

*what&#xff1a; 注释&#xff0c;也是解释&#xff0c;标记。代码中的注释不会被执行&#xff01; *why&#xff1a; 方便提醒自己&#xff0c;这代码代表的是什么功能&#xff1f;当代码量很大的时候&#xff0c;非常有用。 当然&#xff0c;平时写代码就得规范&#x…

3、代码注释与编码规范

目录 一、代码注释 &#xff08;1&#xff09;单行注释 &#xff08;2&#xff09;多行注释 &#xff08;3&#xff09;文档注释 2. 编码规范 一、代码注释 &#xff08;1&#xff09;单行注释 “//”为单行注释标记&#xff0c;从符号“//”开始直到换行为止的所有内容…

关于如何优雅的做好代码注释

问题思考 作为研发同学&#xff0c;对于代码“注释”其实并不陌生。它往往作为我们代码文档的特殊补充而存在。 其实在代码文档中&#xff0c;起主要作用的因素并非注释&#xff0c;而是好的编程风格。 编程风格包括&#xff1a;良好的程序结构、易于理解的方法、有意义的变量…

VS Code - 自动生成代码注释

目录 1. 代码注释 2. 插件安装 3. 使用示例 1. 代码注释 代码注释在软件的迭代过程中举足轻重&#xff0c;所以一个规范化的代码注释也非常重要&#xff0c;在用 VS Code 中则可以使用插件来规范化代码注释。 autoDocstring: VSCode Python Docstring Generator GitHub - N…

python中如何注释代码

1、python中通过#来注释单行不需要运行的代码&#xff0c;如&#xff1a; 此时&#xff0c;被注释代码变灰色了&#xff0c;那么在执行程序时&#xff0c;该行代码就不会被运行了 2、注释多行代码用xxxxx或者"""xxxx"""来注释&#xff0c;作用同…

python 代码注释

文章目录 写在前面使用方法plainEpytextGoogleNumpyreStructuredText相关程序包其他 写在前面 如果说高效率的算法是一个项目的内核&#xff0c;那么完备的文档注释、API 接口则是项目的外壳&#xff0c;直接与客户交互。 pycharm 提供了 5 种 代码注释格式。 分别是 plain, e…

谈代码注释

只要写代码&#xff0c;就会遇到代码注释的问题。在不同的公司&#xff0c;不同的项目组&#xff0c;不同的项目中&#xff0c;可能会有不同的注释标准。有些标准让我们感觉很受益&#xff0c;有些则让我们感觉很反感。而对于没有明确标准的项目&#xff0c;我们往往会遇到“百…

教你写好代码注释

前言 相信大家都会遇到这种情况&#xff1a;一周前自己写的代码&#xff0c;现在再拿出来看&#xff0c;发现读不懂了&#xff0c;“ 这代码是我写的&#xff1f;&#xff1f;&#xff1f;”。这时候&#xff0c;代码注释就可以发挥它的作用了——提高晦涩难懂的代码的可读性&…

关于代码的注释的几种方法

注释就是对代码的解释和说明&#xff0c;其目的是让人们能够更加轻松地了解代码。注释是编写程序时&#xff0c;写程序的人给一个语句、程序段、函数等的解释或提示&#xff0c;能提高程序代码的可读性。注释只是为了提高可读性&#xff0c;不会被计算机编译。 注释一般分为行注…

C++设计模式之观察者模式和发布订阅模式

在软件工程中&#xff0c;设计模式&#xff08;Design Pattern&#xff09;是对软件设计普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;锁提出的解决防范。根据模式的目的来划分的话&#xff0c;GoF&#xff08;Gang of Four&#xff09; 设计模式可以分为以…

Redis发布订阅模式实现原理

前言 发布订阅系统在我们日常的工作中经常会使用到&#xff0c;这种场景大部分情况我们都是使用消息队列&#xff0c;常用的消息队列有 Kafka&#xff0c;RocketMQ&#xff0c;RabbitMQ&#xff0c;每一种消息队列都有其特性&#xff0c;很多时候我们可能不需要独立部署相应的消…

RabbitMQ入门案例之发布订阅模式

前言 本文章主要介绍RabbitMQ的发布订阅模式&#xff0c;该模式下&#xff0c;消息为广播形式&#xff0c;一经发布则会进入交换机绑定的队列中&#xff0c;详细介绍可以阅读官方文档。 官网文档地址&#xff1a;https://rabbitmq.com/getstarted.html 什么是发布与订阅模式 …

浅谈JS发布订阅模式

&#x1f3c6;分享博主自用牛客网&#x1f3c6;&#xff1a;一个非常全面的面试刷题求职网站&#xff0c;真的超级好用&#x1f36c; 文章目录 前言一、发布订阅模式是什么&#xff1f;二、使用步骤1.创建调度中心2.实际操作3. React中的应用 总结 前言 在使用前端各大框架时&…

React 中的发布订阅模式

1、react 通信 react的数据流是单向的, react 通信有以下几种方式&#xff1a; 单向数据流&#xff1a;指当前组件的 state 以 props 的形式流动时只能流向组件树中比自己层级更低的组件 父向子通信&#xff1a;父组件提供state&#xff0c;并且内部设置好数据&#xff0c;子组…

深入Vue原理_全面剖析发布订阅模式

文章目录 发布订阅模式优化优化思路思考理解发布订阅模式(自定义事件)收集更新函数触发更新函数6.5 总结 总结写在最后本期推荐 欢迎各位小伙伴们&#xff01; 为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有…

观察者模式VS发布订阅模式区别

观察者模式VS发布订阅模式区别 观察者模式&#xff1a;订阅者收集函数&#xff0c;发布者循环调用 发布订阅&#xff1a;收集发布单独给一个中介 对比 以结构来分辨模式&#xff0c;发布订阅模式相比观察者模式多了一个调度中心&#xff1b; 以意图来分辨模式&#xff0c;都…

RabbitMQ:发布订阅模式

✨ RabbitMQ:发布订阅模式 1.订阅模式基本介绍2.交换机3.发布订阅模式3.1基本介绍3.2生产者3.3消费者3.4测试 &#x1f4c3;个人主页:不断前进的皮卡丘 &#x1f31e;博客描述:梦想也许遥不可及&#xff0c;但重要的是追梦的过程&#xff0c;用博客记录自己的成长&#xff0c;记…

JavaScript设计模式:四、发布订阅模式

JavaScript设计模式&#xff1a;四、发布订阅模式 文章目录 JavaScript设计模式&#xff1a;四、发布订阅模式一、概述1. 观察者模式2. 发布订阅模式3. 观察者模式是不是发布订阅模式 一、概述 观察者模式&#xff1a; 观察者&#xff08;Observer&#xff09;直接订阅&#x…