いくつかのパフォーマンス上の理由から、選択したノードの兄弟ノードのみを選択する方法を見つけようとしています。
例えば、
<div id="outer">
<div id="inner1"></div>
<div id="inner2"></div>
<div id="inner3"></div>
<div id="inner4"></div>
</div>
inner1 ノードを選択した場合、その兄弟inner2-4
ノードにアクセスする方法はありますか?
いくつかのパフォーマンス上の理由から、選択したノードの兄弟ノードのみを選択する方法を見つけようとしています。
例えば、
<div id="outer">
<div id="inner1"></div>
<div id="inner2"></div>
<div id="inner3"></div>
<div id="inner4"></div>
</div>
inner1 ノードを選択した場合、その兄弟inner2-4
ノードにアクセスする方法はありますか?
ええと...確かに...親にアクセスしてから子にアクセスしてください。
node.parentNode.childNodes[]
または... jQueryを使用:
$('#innerId').siblings()
編集:クレタスはいつものように刺激的です. さらに掘りました。これは、基本的に 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;
これは、その直後の兄弟を返すか、null を返します。これ以上兄弟は利用できません。同様に、 を使用できますpreviousSibling
。
[編集] よく考えてみると、これは次のdiv
タグではなく、ノードの後の空白になります。より良いようです
var sibling = node.nextElementSibling;
も存在しpreviousElementSibling
ます。
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 のようです。
いくつかの方法があります。
次のいずれかでうまくいくはずです。
// 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/
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>
jQuery
$el.siblings();
ネイティブ - 最新、Edge13+
[...el.parentNode.children].filter((child) =>
child !== el
);
ネイティブ (代替) - 最新、Edge13+
Array.from(el.parentNode.children).filter((child) =>
child !== el
);
ネイティブ - IE10+
Array.prototype.filter.call(el.parentNode.children, (child) =>
child !== el
);
var childNodeArray = document.getElementById('somethingOtherThanid').childNodes;
currentNode.nextSibilingプロパティを使用して、次の兄弟ノードにアクセスできます。
これは、イベントリスナーを追加する動的な方法であるイベント委任方法で行うことができる方法です
document.addEventListener('click', (event) => {
if (event.target.matches("#inner1")) {
console.log(event.targert.nextSibling); //inner2 div
console.log(event.targert.nextSibling.nextSibling); //inner3 div
/* The more of the property you keep appending the further it goes to
the next sibling */
}
})