有没有办法选择兄弟节点?

IT技术 javascript dom siblings
2021-02-03 23:59:33

出于某些性能原因,我试图找到一种方法来仅选择所选节点的同级节点。

例如,

<div id="outer">
  <div id="inner1"></div>
  <div id="inner2"></div>
  <div id="inner3"></div>
  <div id="inner4"></div>
</div>

如果我选择了inner1节点,有没有办法让我访问它的兄弟inner2-4节点节点?

6个回答

嗯......当然......只需访问父母,然后访问孩子。

 node.parentNode.childNodes[]

或...使用jQuery:

$('#innerId').siblings()

编辑:Cletus 一如既往地鼓舞人心。我进一步挖掘。这就是 jQuery 获取兄弟的方式:

function getChildren(n, skipMe){
    var r = [];
    for ( ; n; n = n.nextSibling ) 
       if ( n.nodeType == 1 && n != skipMe)
          r.push( n );        
    return r;
};

function getSiblings(n) {
    return getChildren(n.parentNode.firstChild, n);
}
实际上,jquery 中 node.parentNode.childNodes[] 的等价物实际上是 $(node).parent().children() 而不是 $(node).siblings()。它可能是一个不错的功能,但也可能很烦人。这取决于你想要什么。
2021-03-20 23:59:33
您需要使用 node.parentNode.childNodes 检查 ELEMENT_NODE 节点,因为它也会为您提供空白文本节点。
2021-03-23 23:59:33
请注意, jquery.siblings() 从结果集中排除当前节点。
2021-03-31 23:59:33
没什么,我认为这是一个错误 - 对此感到抱歉(已删除)
2021-04-04 23:59:33
这是一个非常好的功能!
2021-04-09 23:59:33
var sibling = node.nextSibling;

这将在它之后立即返回同级,或者 null 没有更多的同级可用。同样,您可以使用previousSibling.

[编辑] 再想一想,这不会给出下一个div标签,而是节点后面的空格。更好的似乎是

var sibling = node.nextElementSibling;

还有一个previousElementSibling.

从 IE9 开始就是这样。另见stackoverflow.com/questions/5197825/...
2021-04-07 23:59:33
IE8 不支持 next/previousElementSibling
2021-04-10 23:59:33

快的:

var siblings = n => [...n.parentElement.children].filter(c=>c!=n)

https://codepen.io/anon/pen/LLoyrP?editors=1011

将父元素的子元素作为数组获取,过滤掉这个元素。

编辑:

并过滤掉文本节点(感谢pmrotule):

var siblings = n => [...n.parentElement.children].filter(c=>c.nodeType == 1 && c!=n)
不错的解决方案。虽然,我会检查 nodeType 以丢弃文本节点[ ...n.parentNode.children ].filter(c => c.nodeType == 1 && c != n)
2021-03-23 23:59:33
你会如何修改这个typescript?
2021-04-06 23:59:33

从 2017 年开始:
直接回答:element.nextElementSibling为了获得正确的元素兄弟。你也有element.previousElementSibling上一个

从这里获得所有下一个兄弟姐妹非常简单

var n = element, ret = [];
while (n = n.nextElementSibling){
  ret.push(n)
}
return ret;
为什么不。如果您拍摄下一张和上一张,您可以获得全貌。答案是展示了一种新的做事方式。并为读者贡献一些东西。只是为了成为父母并去每个元素并过滤当前每个人都可以做的
2021-04-04 23:59:33
它应该返回所有兄弟姐妹,而不仅仅是nextor previous在这种情况下,准确地指定向后或向前并没有多大帮助。
2021-04-12 23:59:33

您是否检查过 jQuery 中的“兄弟姐妹”方法?

    sibling: function( n, elem ) {
        var r = [];

        for ( ; n; n = n.nextSibling ) {
            if ( n.nodeType === 1 && n !== elem ) {
                r.push( n );
            }
        }

        return r;
    }

n.nodeType == 1 检查元素是否是 html 节点,并且 n!== 排除当前元素。

我认为您可以使用相同的功能,所有这些代码似乎都是普通的 javascript。