2016-05-04 13 views
0

特定の要素と最も近い共通祖先を共有するDOM要素を選択する方法を見つける必要があります。最も近い共通祖先を持つ要素を選択する

<div class="grandparent"> 
    <span class="match not-this-one"> 
    <div class="parent"> 
     <span class="match this-one"> 
     <div class="container"> 
     <span class="me"> 
     </div> 
</div> 

は私がこれを行うに何かしたい:

は、ここで私が何を意味するかだ

$('.me').closestCousin('match'); selects <span class="match this-one"> 

最も近い()と親()選択の祖先が、しかし、いとこの要素を検索しません。

+0

siblings()? – guest271314

答えて

1

あなたは.closest()によって一致されることから、現在の要素を除外するために、セレクタ:not(.me).closest()を使用することができます。セレクタ質問でhtml` `で` `タグと終了タグの欠落.match

$(".me").closest(":not(.me)").siblings(".match").addClass("matched")
.matched { 
 
    color:blue; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> 
 
</script> 
 
<div class="grandparent"> 
 
    <span class="match not-this-one">not-this-one</span> 
 
    <div class="parent"> 
 
     <span class="match this-one">match this-one</span> 
 
     <div class="container"> 
 
     <span class="me">me</span> 
 
     </div> 
 
</div>

+0

これは、現在の要素の親の外側に、最も近いものがある場合にはうまくいかないでしょう。 – dave

+0

@dave _ "最近の共通祖先を共有するDOM要素を選択するには、元のQuestion _に記載されている要件の範囲外になる可能性があります。与えられた要素 "_一致する要素は' .me'の親の兄弟です – guest271314

+0

あなたは正しいです。私はその質問を誤解した。私は彼が試合を見つけるまで、木を探し続けたいと思った。 – dave

0

これは動作するはずです: $( '。me')。closest( '。match');

しかし、それはDOMツリーだけを上回ります。それは、何が必要

+0

結果は返されません – dave

1

だ場合、私はあなたの最善の策は、あなたの最も近いいとこを見つけるため.prev().parent()の使用を組み合わせた再帰関数を書くことだと思います。

編集:質問に間違いがありました。このソリューションはツリーを検索して最も近いターゲットを見つけ、その実装の副産物として元の要素に兄弟を見つけることもできます。

function closestCousin(me, target) { 
 
    var cousin = me.prev(target); 
 
    if (cousin.length) { 
 
    return cousin; 
 
    } else { 
 
    var parent = me.parent(); 
 
    if (parent.length) { 
 
     return closestCousin(parent, target); 
 
    } else { 
 
     return parent; 
 
    } 
 
    } 
 
} 
 

 
var me = $(".me"); 
 
closestCousin(me, ".match").css("color", "red"); 
 
closestCousin(me, ".match2").css("color", "blue");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div class="grandparent"> 
 
    <span class="match match2 not-this-one">Don't Match</span> 
 
    <div class="parent"> 
 
     <span class="match this-one">Match</span> 
 
     <div class="container"> 
 
     <span class="me">Me</span> 
 
     </div> 
 
    </div> 
 
</div>

+1

' Match'が 'html'の' .container'の下に置かれている場合は '.not-this-one'を選択しますhttps:// jsfiddle .net/2yn3vdzy/ – guest271314

関連する問題