获取所有兄弟元素节点(不含自身)的最常用方法是通过父节点的children属性结合过滤操作,具体步骤为:1. 获取目标元素的父节点(parentnode);2. 通过父节点的children属性获取所有子元素集合(htmlcollection);3. 使用array.from()将集合转换为数组,并用filter()方法排除目标元素本身。该方法能准确返回所有同级兄弟元素,不受文本节点或注释节点干扰,且逻辑清晰、兼容性好,适用于绝大多数场景。例如使用函数封装:function getallsiblings(element) { return element && element.parentnode ? array.from(element.parentnode.children).filter(child => child !== element) : []; },调用后即可获得不含自身的兄弟元素数组,完整解决了动态获取兄弟节点的需求。

JavaScript获取元素的兄弟节点,最直接的方式是利用其自身的属性,如
nextElementSibling
previousElementSibling
parentNode
children
要获取一个DOM元素的兄弟节点,我们有几种常用的方法,每种都有其适用场景。
1. 获取紧邻的下一个/上一个元素节点:nextElementSibling
previousElementSibling
这是我个人在日常开发中最常使用的,因为它只关心“元素”节点,非常符合我们通常操作DOM的意图。
// 假设有一个HTML结构:
// <div id="parent">
// <p>第一个段落</p>
// <span id="target">目标元素</span>
// <div>第三个div</div>
// <!-- 这是一个注释 -->
// <a href="#">链接</a>
// </div>
const targetElement = document.getElementById('target');
// 获取紧邻的下一个兄弟元素
const nextSiblingElement = targetElement.nextElementSibling;
console.log(nextSiblingElement); // 输出:<div>第三个div</div>
// 获取紧邻的上一个兄弟元素
const previousSiblingElement = targetElement.previousElementSibling;
console.log(previousSiblingElement); // 输出:<p>第一个段落</p>
// 如果没有下一个/上一个元素,它们会返回 null
const firstP = document.querySelector('#parent p');
console.log(firstP.previousElementSibling); // 输出:null2. 获取所有类型的紧邻兄弟节点:nextSibling
previousSibling
这两个属性会返回任何类型的节点,包括元素节点、文本节点(比如HTML标签之间的换行符或空格)和注释节点。这在某些特定场景下有用,但如果只是想操作可见的DOM元素,它们可能会带来一些意想不到的“惊喜”。
// 基于上面的HTML结构,注意HTML源码中标签之间的换行和空格会生成文本节点
// <p>第一个段落</p>
// <span id="target">目标元素</span> <-- 这里有一个换行和空格
// <div>第三个div</div>
const targetElement = document.getElementById('target');
// 获取紧邻的下一个兄弟节点(可能是文本节点)
const nextSiblingNode = targetElement.nextSibling;
console.log(nextSiblingNode); // 可能会输出一个 Text 节点,代表换行或空格
// 获取紧邻的上一个兄弟节点(也可能是文本节点)
const previousSiblingNode = targetElement.previousSibling;
console.log(previousSiblingNode); // 可能会输出一个 Text 节点3. 获取所有兄弟元素节点(不包括自身):结合 parentNode.children
如果我需要拿到某个元素的所有兄弟元素,而不仅仅是紧邻的那个,我通常会这样做:
const targetElement = document.getElementById('target');
const parent = targetElement.parentNode;
if (parent) {
// parent.children 返回的是一个 HTMLCollection,不是真正的数组,
// 所以我通常会把它转换成数组,方便使用数组方法
const allSiblings = Array.from(parent.children).filter(child => child !== targetElement);
console.log(allSiblings); // 输出:[<p>第一个段落</p>, <div>第三个div</div>, <a href="#">链接</a>]
}要获取一个元素的所有兄弟节点,并且排除掉它自己,最常见且可靠的方法是利用其父元素的
children
具体来说,你可以这样做:
parentNode
children
HTMLCollection
children
childNodes
childNodes
HTMLCollection
Array.from()
filter()
function getAllSiblings(element) {
if (!element || !element.parentNode) {
return []; // 如果元素不存在或没有父节点,就返回空数组
}
const parent = element.parentNode;
// 使用 Array.from 将 HTMLCollection 转换为数组,方便使用 filter
return Array.from(parent.children).filter(child => child !== element);
}
// 示例用法:
const targetElement = document.getElementById('target');
const siblings = getAllSiblings(targetElement);
console.log("所有兄弟节点(不含自身):", siblings);
// 结果会是:[<p>第一个段落</p>, <div>第三个div</div>, <a href="#">链接</a>]这种方法的好处在于,它提供了一个完整的兄弟元素列表,无论目标元素是第一个、最后一个还是中间的,都能准确获取到所有其他同级元素。这比反复调用
nextElementSibling
previousElementSibling
nextSibling
#text
nextElementSibling
这是一个非常经典的“坑”,也是初学者常常会感到困惑的地方。核心原因在于DOM(文档对象模型)对“节点”和“元素”的定义是不同的。
Node
<div>
<p>
<span>
<!-- 这是一个注释 -->
Element
Node
现在我们来看
nextSibling
nextElementSibling
nextSibling
nextSibling
<!-- HTML 结构 --> <div id="box1">Box 1</div> <!-- 这里有一个换行符和几个空格 --> <div id="box2">Box 2</div>
const box1 = document.getElementById('box1');
console.log(box1.nextSibling); // 可能会输出 #text 节点,内容是换行和空格nextElementSibling
const box1 = document.getElementById('box1');
console.log(box1.nextElementSibling); // 输出:<div id="box2">Box 2</div>所以,我个人习惯是,如果我明确知道我只想操作HTML元素,那么
nextElementSibling
previousElementSibling
在实际项目中处理DOM,尤其是获取兄弟节点时,确实有一些需要留心的地方,避免一些意料之外的“坑”。
空值检查(Null Checks): 这是最基本也最容易被忽视的一点。当一个元素是其父元素的第一个子元素时,
previousElementSibling
null
nextElementSibling
null
null
const firstElement = document.querySelector('#parent p');
const nextEl = firstElement.nextElementSibling; // 正常返回 <span>
const prevEl = firstElement.previousElementSibling; // 返回 null
// 错误示范:
// console.log(prevEl.textContent); // 报错:Cannot read properties of null (reading 'textContent')
// 正确做法:
if (prevEl) {
console.log(prevEl.textContent);
} else {
console.log("没有上一个兄弟元素。");
}养成随手进行
if (element)
element?.property
动态DOM的变化: 在单页应用(SPA)或大量使用JavaScript操作DOM的场景中,页面的结构是动态变化的。如果你获取了一个元素的兄弟节点,然后DOM结构发生了变化(比如某个兄弟节点被移除、新增,或者元素本身被移动了位置),你之前缓存的兄弟节点引用可能就不再准确了。 我的建议是,如果DOM结构可能会频繁变动,尽量在需要时才去查询DOM,或者确保你的逻辑能正确处理DOM变化后的引用更新。避免长时间持有旧的DOM节点引用。
性能考量(通常不是大问题): 虽然DOM操作相对CPU密集,但在现代浏览器中,获取兄弟节点通常性能消耗很小。不过,如果你在一个非常大的循环中,对成千上万个元素频繁地执行
Array.from(parentNode.children).filter(...)
HTML结构中的空白字符: 前面提过,HTML标签之间的换行、空格会被解析成文本节点。这会影响
nextSibling
previousSibling
*ElementSibling
跨浏览器兼容性: 虽然现代浏览器对
nextElementSibling
previousElementSibling
nextSibling
nodeType
*ElementSibling
总的来说,在获取兄弟节点时,保持对
null
以上就是js怎么获取元素的兄弟节点的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号