有没有办法select兄弟节点?
出于一些性能的原因,我试图find一种方法来select只select节点的兄弟节点。 例如,
<div id="outer"> <div id="inner1"> </div> <div id="inner2"> </div> <div id="inner3"> </div> <div id="inner4"> </div> </div>
如果我selectinner1节点,有没有办法让我访问它的兄弟姐妹,inner2-4节点?
那么…确定…只要访问父母,然后是孩子。
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); }
var sibling = node.nextSibling;
这将在它之后立即返回兄弟,或者不再有兄弟可用。 同样,你可以使用previousSibling
。
[编辑]第二个想法,这不会给下一个div
标记,但节点后的空白。 好像是
var sibling = node.nextElementSibling;
还有一个previousElementSibling
。
有几种方法可以做到这一点。
以下任何一种都可以做到这一点。
// METHOD A (ARRAY.FILTER, STRING.INDEXOF) var siblings = function(node, children) { siblingList = children.filter(function(val) { return [node].indexOf(val) != -1; }); return siblingList; } // METHOD B (FOR LOOP, IF STATEMENT, ARRAY.PUSH) var siblings = function(node, children) { var siblingList = []; for (var n = children.length - 1; n >= 0; n--) { if (children[n] != node) { siblingList.push(children[n]); } } return siblingList; } // METHOD C (STRING.INDEXOF, ARRAY.SPLICE) var siblings = function(node, children) { siblingList = children; index = siblingList.indexOf(node); if(index != -1) { siblingList.splice(index, 1); } return siblingList; }
仅供参考:jQuery代码库是观察A级Javascript的极好资源。
这是一个非常优秀的工具,以非常简洁的方式显示jQuery代码库。 http://james.padolsey.com/jquery/
你有没有检查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!==排除当前元素。
我认为你可以使用相同的function,所有的代码似乎是香草的JavaScript。
快:
var siblings = n => [...n.parentElement.children].filter(c=>c!=n)
https://codepen.io/anon/pen/LLoyrP?editors=1011
将父项的子项作为一个数组,过滤掉这个元素。
从2017年起:
直截了当的答案: element.nextElementSibling
获取正确的元素兄弟。 还有你以前的element.previousElementSibling
从这里很容易得到所有下一个兄弟
var n = element, ret = []; while (n = n.nextElementSibling){ ret.push(n) } return ret;
使用document.querySelectorAll()和循环和迭代
function sibblingOf(children,targetChild){ var children = document.querySelectorAll(children); for(var i=0; i< children.length; i++){ children[i].addEventListener("click", function(){ for(var y=0; y<children.length;y++){children[y].classList.remove("target")} this.classList.add("target") }, false) } } sibblingOf("#outer >div","#inner2");
#outer >div:not(.target){color:red}
<div id="outer"> <div id="inner1">Div 1 </div> <div id="inner2">Div 2 </div> <div id="inner3">Div 3 </div> <div id="inner4">Div 4 </div> </div>
var childNodeArray = document.getElementById('somethingOtherThanid').childNodes;
以下是如何获得上一个,下一个和所有兄弟姐妹(双方):
function prevSiblings(target) { var siblings = [], n = target; while(n = n.previousElementSibling) siblings.push(n); return siblings; } function nextSiblings(target) { var siblings = [], n = target; while(n = n.nextElementSibling) siblings.push(n); return siblings; } function siblings(target) { var prev = prevSiblings(target) || [], next = nexSiblings(target) || []; return prev.concat(next); }
x1 = document.getElementById('outer')[0] .getElementsByTagName('ul')[1] .getElementsByTagName('li')[2]; x1.setAttribute("id", "buyOnlineLocationFix");