これら 2 つのステートメントで交差しているドメインを理解することが役立つと思います。
if ($('this:not(.white)')) {console.log('not white');};
セレクター -this:not(.white)
はこの種類の要素を探すため、このステートメントは機能しません: <this class="white"></this>
. this
つまり、セレクターは、クラスではないtype の HTML 要素を探していますwhite
。
if ($(this).not('.white')) {console.log('not white');};
この場合、キーワードが参照$(this)
する JavaScript オブジェクトをthis
jQuery オブジェクトでラップする を使用しているため、その DOM 要素に対して jQuery メソッドを利用できます。
探している効果を得るには、に渡すすべての STRING セレクターが、$(selector)
CSS が一致できるセレクターに制限されていることを理解する必要があります。したがって、「this」キーワードをそのように使用することはできません。
ただし、効果を確認するためにできることは次のとおりです。
if ($(this).is(':not(.white)')) {
console.log('Not White! :(');
} else {
console.log('White! :D');
}
this
ブロック内に配置したため、適用されるさらに jQuery チェーン メソッドは、現在のコンテキスト$()
で参照する DOM 要素に対して解決されます。this
次に、CSS:not()
セレクターを使用してクラスをチェックします。
ただし、このアプローチの制限は、何らかの理由this
で複数の DOM 要素を参照する場合、そのようなすべての要素がセレクターに一致する場合.is()
にのみ結果が返されることに注意してください。true
だから - この例を考えてみましょう:
<div class="one white element"></div>
<div class="one black element"></div>
<div class="one green element"></div>
$('.one.element').bind('click', function () {
// In this context, 'this' refers to the element which was clicked.
console.log( $(this).is(':not(.white)') );
// If you click either the black or green element, you will get a 'true',
// because those elements are not .white.
// If you click the white element, you will get a 'false',
// because that element does have the .white class
});
問題は、ほとんどの JavaScript アプリケーションでかなり頻繁にコンテキストがthis
変更されることです。そのため、私が知っているほとんどのプログラマーは、可能な限りそれを使用することを避けています。上記よりも安全なのは次のとおりです。
$('.one.element').bind('click', function (ev) {
var $el = $(ev.target);
console.log( $el.is(':not(.white)') );
// In this case, you avoid 'this' entirely, and target the actual element
// from which the event originated.
});
ただし、この場合、ネストされたアイテムが誤ったターゲットを発生させるという問題に遭遇します。このケースを考えてみましょう:
<div class="parent">
<div class="child">
text
</div>
</div>
$('.parent').bind('click', function (ev) {
var $el = $(ev.target);
console.log( $el.attr('class') );
});
この場合、parent
それ自体をクリックするparent
と、結果として取得されます。ただし、子をクリックすると、イベントが親要素にバインドされていても、child
イベントのバブリングにより取得されます。実際のイベントは子要素によって発生したため、対象を誤っています。
したがって、通常、プラグインを作成するときは、参照を慎重に制御することが賢明です。
例
<div class="parent">
<div class="child">
text
</div>
</div>
var $parent = $('.parent').bind('click', function () {
console.log( $parent.attr('class') );
});
親をクリックするか子をクリックするかに関係なく、正しい結果が得られ、何を参照しているかがわかります。コンテキストの変更による混乱がthis
なく、従属ノードの属性を使用する可能性がありません。
ちなみに、ここの他の回答に投稿された方法も有効です。
// The following will all tell you if the node HAS the class:
$(selector).hasClass('white')
$(selector).is('.white')
$(selector).is('[class*=white]')
// The following will all tell you if the node DOES NOT have the class:
!$(selector).hasClass('white')
$(selector).not('.white')
$(selector).is(':not(.white)')
そして - それを行う他の方法がありますが、これらのいずれもあなたの目的に合うはずです. :)