【Web APIs】JavaScript 节点操作 ⑤ ( 操作兄弟节点 | 获取兄弟节点属性 | 自定义兼容函数 )
文章目录
在 【Web APIs】JavaScript 节点操作 ① ( DOM 方式获取标签元素的弊端 | 节点简介 | DOM 节点概述 | 节点基本属性 - 节点类型、节点名称、节点值 ) 博客 中 , 介绍了 传统 DOM 方式获取节点的方式 及其 弊端 ( 调用繁琐、逻辑性差 ) , 并对 节点的基本属性 ( 节点类型、节点名称、节点值 ) 进行了简要介绍 ;
在 【Web APIs】JavaScript 节点操作 ② ( DOM 节点层级 | 利用节点间的层次关系获取元素 | 遍历节点层级 | 获取 父节点 / 子节点 代码示例 ) 博客 中 , 介绍了 利用 节点间的层次关系获取元素 , 通过 parentNode 获取父元素 , 通过 childNodes 获取所有类型节点 ( 包括文本节点 ) , 通过 children 获取子元素节点 , 并给出了示例代码 ;
在 【Web APIs】JavaScript 节点操作 ③ ( 子节点操作 | firstChild 属性 | firstElementChild 属性 | children[0] 属性 ) 博客 中 介绍 了 第一个子节点 和 最后一个子节点 的获取方式 ;
在 【Web APIs】JavaScript 节点操作 ④ ( 节点操作案例 - 下拉菜单案例 ) 博客中 , 开发了一个 节点操作的案例 , 控制下拉菜单 显示 / 隐藏 ;
一、JavaScript 兄弟节点操作
1、获取兄弟节点属性 - previousSibling、nextSibling、previousElementSibling、nextElementSibling 属性
在 JavaScript 的 DOM 节点操作中 , 兄弟节点 指的是拥有 相同父节点 的节点 ;
通过 元素 的 下面几个属性 , 可获取兄弟节点 :
- previousSibling : 返回 当前节点的 前一个兄弟节点 , 注意 : 返回的节点 包括 文本节点 和 注释节点 ; ( 不推荐使用 )
- nextSibling : 返回 当前节点的 后一个兄弟节点 , 注意 : 返回的节点 包括 文本节点 和 注释节点 ; ( 不推荐使用 )
- previousElementSibling : 返回 当前节点的 前一个 元素类型 兄弟节点 ; ( 不推荐使用 , IE9 以上的浏览器才支持 )
- nextElementSibling : 返回 当前节点的 后一个 元素类型 兄弟节点 ; ( 不推荐使用 , IE9 以上的浏览器才支持 )
2、获取兄弟节点属性 - 自定义兼容函数
previousSibling 和 nextSibling 不存在兼容性问题 , 所有版本的浏览器都可以使用 , 但是 获取的兄弟节点 包括 文本节点 和 注释节点 ;
previousElementSibling 和 nextElementSibling 可以获取 元素类型 的兄弟节点 , 可以过滤 文本类型节点 和 注释类型节点 , 但是 存在浏览器兼容性问题 , 只有 IE9 以上的浏览器才可以使用 ;
这里为了 保证 浏览器兼容性 , 推荐自己封装一个函数 , 将 previousSibling 和 nextSibling 属性封装到一个函数中 , 由开发者自己手动过滤 文本类型节点 和 注释类型节点 ;
// 获取前一个兄弟元素节点
function getPreviousElementSibling(element) {
var previous = element.previousSibling;
while (previous) {
if (previous.nodeType === 1) { // Node.ELEMENT_NODE
return previous;
}
previous = previous.previousSibling;
}
return null;
}
// 获取后一个兄弟元素节点
function getNextElementSibling(element) {
var next = element.nextSibling;
while (next) {
if (next.nodeType === 1) { // Node.ELEMENT_NODE
return next;
}
next = next.nextSibling;
}
return null;
}
二、兄弟节点操作 - 代码示例
1、完整代码示例
代码示例 :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>兄弟节点操作</title>
</head>
<body>
<div>div 节点</div>
<span>span 节点</span>
<script>
var div = document.querySelector('div');
var span = document.querySelector('span');
console.log('1. nextSibling 和 previousSibling 属性 (获取所有类型节点) ');
// nextSibling 属性 返回 当前节点的 前一个兄弟节点 ,
// 注意 : 返回的节点 包括 文本节点 和 注释节点 ; ( 不推荐使用 )
console.log(div.nextSibling);
// previousSibling : 返回 当前节点的 后一个兄弟节点 ,
// 注意 : 返回的节点 包括 文本节点 和 注释节点 ; ( 不推荐使用 )
console.log(span.previousSibling);
console.log('2. nextElementSibling 和 previousElementSibling 属性 (IE9以上支持) ');
// previousElementSibling 属性 返回 当前节点的 前一个 元素类型 兄弟节点 ;
// ( 不推荐使用 , IE9 以上的浏览器才支持 )
console.log(div.nextElementSibling);
// nextElementSibling 属性 返回 当前节点的 后一个 元素类型 兄弟节点 ;
// ( 不推荐使用 , IE9 以上的浏览器才支持 )
console.log(span.previousElementSibling);
console.log('3. 自定义兼容函数');
// 自定义兼容函数 获取后一个 元素类型兄弟节点
console.log(getNextElementSibling(div));
// 自定义兼容函数 获取前一个 元素类型兄弟节点
console.log(getPreviousElementSibling(span));
// 获取前一个兄弟元素节点
function getPreviousElementSibling(element) {
var previous = element.previousSibling;
while (previous) {
if (previous.nodeType === 1) { // Node.ELEMENT_NODE
return previous;
}
previous = previous.previousSibling;
}
return null;
}
// 获取后一个兄弟元素节点
function getNextElementSibling(element) {
var next = element.nextSibling;
while (next) {
if (next.nodeType === 1) { // Node.ELEMENT_NODE
return next;
}
next = next.nextSibling;
}
return null;
}
</script>
</body>
</html>
2、执行结果
执行结果 :

更多推荐
所有评论(0)