2016-12-08 14 views
1

別のliをクリックしたときに、removeClassがアクティブなクラスを削除しない理由を理解できないようです。それが同じ李だったら私はクラスを削除するために兄弟を使用することができますが、悲しいことに、ここでもうまくいきません。jQuery removeClassがクリック機能で動作しないのはなぜですか?

私が持っているこの単純な問題を理解したいと思います。

$('.r-picker li').click(function(){ 
 
    $('.r-picker li .data.active').removeClass('active'); 
 
    $('.r-picker li .data').addClass('active'); 
 
});
.active{ 
 
    color:red; 
 
    font-size:25px; 
 
    font-weight:bold; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="r-picker"> 
 
    <ul> 
 
    <li> 
 
     <div class="data">me1</div> 
 
    </li> 
 
    <li> 
 
     <div class="data">me1</div> 
 
    </li> 
 
    </ul> 
 
</div>

http://jsfiddle.net/Lb65e/125/

+3

私の推測では、それが動作していることです。しかし、 '.removeClass()'に続くステートメントは、あなたがクラスを削除したものを含め、すべての 'li .data'要素に' active'クラスを戻します。 – War10ck

答えて

3

Updated fiddle

あなたは、クリックされたliを参照する代わりに$(this)を使用する必要があります。

エルス
$('.data', this).addClass('active'); 

あなたのコード内の.dataセレクタは、このクラスを持つすべての要素にクラスを追加します:

$('.r-picker li .data').addClass('active'); 

NOTE :また、クリックすると、dataクラスのすべてのelmentsからクラスactiveを削除する必要があります。

$('.r-picker li .data').removeClass('active'); 

希望します。

$('.r-picker li').click(function() { 
 
    $('.r-picker li .data').removeClass('active'); 
 
    $('.data', this).addClass('active'); 
 
});
.active{ 
 
    color:red; 
 
    font-size:25px; 
 
    font-weight:bold; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="r-picker"> 
 
    <ul> 
 
    <li> 
 
     <div class="data">me1</div> 
 
    </li> 
 
    <li> 
 
     <div class="data">me1</div> 
 
    </li> 
 
    </ul> 
 
</div>

+2

最高回答+1。私の明確化のために、 '$( 'data'、this)'文は何をしますか?私は決して前にそのような書かれたセレクタを見たことがない。私は 'this'が保持している現在の要素コンテキストの階層内で' .data'を検索すると思いますか?おそらく '$(this).find( '。data')'の略語ですか?私は、その推測が正しいか、本当に基底から外れているかどうか疑問に思っています... – War10ck

+2

はい、まったく正しい@ War10ck ..あなたの介入に感謝します:) –

+0

@ War10ck '$(" foo "、bar)'は内部的にまったく同じように扱われます'$(bar).find(" foo ")' – Pointy

1

あなたのコード作業です。ここではそれが何をするかです:クラスdataactiveを持つすべての要素を検索し、それらのすべてからactiveを削除

$('.r-picker li .data.active').removeClass('active'); 

を。クラスdataを持つすべての要素を検索し、それらのすべてにクラスactiveを追加

$('.r-picker li .data').addClass('active'); 

これが実行されると、削除されたすべての要素にクラスactiveが追加されます。あなたのイベントハンドラで

クラスを追加するとき、あなただけの関与<li>に追加する必要があります。

$(this).find(".data").addClass("active"); 

jQueryのイベントメカニズムがthisがに関与DOM要素にバインドされていることを確認しますそのため、$(this)はその要素のjQueryオブジェクトを提供します。 .find()メソッドは、その要素から始まるDOMセレクタ検索を実行します。したがって、$(this).find(".data")は、クリックされた要素の下のDOMサブツリーにクラスdataの要素を検出します。

1

現在のliのdivをハイライト表示する必要があります。

最初にアクティブなクラスを削除してからdiv.dataを見つけます。 thisli

相続人は、あなたのフィドルが更新され、作業...バッククラスを追加します:http://jsfiddle.net/Lb65e/126/

関連する問題