马黑黑 发表于 2023-2-17 08:27

JS 遍历兄弟元素

本帖最后由 马黑黑 于 2023-2-17 08:31 编辑

有人问我,jQuery内部为什么使用了比较笨拙的方法遍历兄弟元素。我的答案是:为了兼容。jQuery所封装的方法都充分考虑兼容问题,所以它的方法不一定是最科学的但是肯定是最有效的。

原生JS遍历兄弟元素可以有很多方法,比方说直接法,JS内置的 nextElementSibling 和 previousElementSibling 就可以直接查询下一个和上一个兄弟元素,但封装起来会啰嗦一点,所以可以换个思路:找到父元素,查询父元素下的所有子元素,它们就是兄弟元素。

我们来看看第二种方法。假设有这么一个HTML局部文档结构:

<div id="mydiv">
      <div>Div</div>
      <p>P1</p>
      <p>P2</p>
      <p id="p3" style="color: red;">P3</p>
      <p>P4</p>
      <p>P5</p>
      <input type="text" value="Text Box"/>
      <button>Button</button>
</div>


我们能一眼瞧出来,id="mydiv" 的 div 是父元素,其下有 div、p、input、button 等子元素,这些子元素平级,它们全部都是一个父亲的孩子,所以叫兄弟元素。现在,id="p3" 是我们已经获知的元素,我们要查找出它的所有兄弟元素,并令它们的前景色和自己的一样。看JS代码:

<script>

let siblings = p3.parentElement.children;
let color = p3.style.color || 'red';
[...siblings].forEach((item,key) => item.style.color = color);

</script>


第一句:这个是二合一的语句,p3.parentElement 得到的是 p3 的父元素,p3.parentElement.children 得到的是 p3 父元素的所有的孩子(包括p3自己在内)。然后将获取到的值存储到 siblings 变量里。

第二句:获取 p3 的最终渲染前景色,即 p3.style.color,如果 p3 没有设置前景色,则设置颜色为 red(红色),并保存在变量 color 里。

第三句:遍历获取到的兄弟元素,设置前景色为 color 变量存储的值。这个设置,p3 也会重新设置,因为我们没有使用排除法将其剔除。

其实获取兄弟元素仅第一句代码就已完成,简单的一匹,但是,它的兼容性是有问题的:除了现代浏览器,古董级别的浏览器是无法识别诸如 children、parentElement 等等JS新概念,所以jQuery并不采用,宁可多绕点弯儿。

效果请看下楼。

马黑黑 发表于 2023-2-17 08:28

<div id="mydiv">
        <div>Div</div>
        <p>P1</p>
        <p>P2</p>
        <p id="p3" style="color: red;">P3</p>
        <p>P4</p>
        <p>P5</p>
        <input type="text" value="Text Box"/>
        <button>Button</button>
</div>
<p><br><br><input id="okey" type="button" value="点击我改变所有兄弟元素前景色" /></p>

<script>
okey.onclick = () => {
        let siblings = p3.parentElement.children;
        let color = p3.style.color || 'red';
        [...siblings].forEach((item,key) => item.style.color = color);
}
</script>

起个网名好难 发表于 2023-2-17 10:09

本帖最后由 起个网名好难 于 2023-2-17 12:16 编辑

$("#p3").parent().children().css({"color":"red"});或
$("#p3").siblings().css({"color":"red"});

红影 发表于 2023-2-17 10:11

拉上所有兄弟,一起投身革命的伟大事业{:4_173:}

庶民 发表于 2023-2-17 11:38

慢慢体会这些技术。

马黑黑 发表于 2023-2-17 12:25

庶民 发表于 2023-2-17 11:38
慢慢体会这些技术。

{:4_190:}

马黑黑 发表于 2023-2-17 12:25

红影 发表于 2023-2-17 10:11
拉上所有兄弟,一起投身革命的伟大事业

红红火火干革命挺好{:4_181:}

马黑黑 发表于 2023-2-17 12:26

起个网名好难 发表于 2023-2-17 10:09
$("#p3").parent().children().css({"color":"red"});或
$("#p3").siblings().css({"color":"red"});

我说的是它的内部实现机制。封装过的用起来自然顺手{:4_170:}

樵歌 发表于 2023-2-17 13:21

又顿悟新功法了{:4_203:}

红影 发表于 2023-2-17 14:14

马黑黑 发表于 2023-2-17 12:25
红红火火干革命挺好

找齐所有兄弟,用这个法子真好{:4_187:}

起个网名好难 发表于 2023-2-17 16:01

马黑黑 发表于 2023-2-17 12:26
我说的是它的内部实现机制。封装过的用起来自然顺手

轮子不错

马黑黑 发表于 2023-2-17 19:30

起个网名好难 发表于 2023-2-17 16:01
轮子不错

对,结实

马黑黑 发表于 2023-2-17 19:34

红影 发表于 2023-2-17 14:14
找齐所有兄弟,用这个法子真好

都要找找

马黑黑 发表于 2023-2-17 19:38

樵歌 发表于 2023-2-17 13:21
又顿悟新功法了

这个无需顿悟

红影 发表于 2023-2-17 21:03

马黑黑 发表于 2023-2-17 19:34
都要找找

其实每个功能单独讲的时候还能看明白点,合在一起就又糊涂了。

马黑黑 发表于 2023-2-17 21:28

红影 发表于 2023-2-17 21:03
其实每个功能单独讲的时候还能看明白点,合在一起就又糊涂了。

必须合在一起,否则没有多大意义

红影 发表于 2023-2-17 22:08

马黑黑 发表于 2023-2-17 21:28
必须合在一起,否则没有多大意义

知道啊,只是我笨,所以学得慢{:4_173:}

马黑黑 发表于 2023-2-17 22:35

红影 发表于 2023-2-17 22:08
知道啊,只是我笨,所以学得慢

慢慢学

红影 发表于 2023-2-18 10:53

马黑黑 发表于 2023-2-17 22:35
慢慢学

嗯嗯,只要不停行走,总有一天能走到目标的。

马黑黑 发表于 2023-2-18 11:30

红影 发表于 2023-2-18 10:53
嗯嗯,只要不停行走,总有一天能走到目标的。

都不了的话那是因为路实在太远太远
页: [1] 2
查看完整版本: JS 遍历兄弟元素