我认为这可能对您了解您在这两个陈述中跨越的领域有所帮助。
if ($('this:not(.white)')) {console.log('not white');};
该语句将不起作用,因为选择器 -this:not(.white)
将查找这种类型的元素:<this class="white"></this>
. 换句话说,您的选择器正在寻找一个this
不属于 class的 type 的 HTML 元素white
。
if ($(this).not('.white')) {console.log('not white');};
在这种情况下,您正在使用$(this)
,它将this
关键字引用的 JavaScript 对象包装在 jQuery 对象中,从而允许您针对该 DOM 元素使用 jQuery 方法。
为了获得您正在寻找的效果,您必须了解您传递给 a 的任何 STRING 选择器$(selector)
都受限于 CSS 可以匹配的选择器。因此 - 你不能那样使用你的“this”关键字。
但是,您可以执行以下操作来检查您的效果:
if ($(this).is(':not(.white)')) {
console.log('Not White! :(');
} else {
console.log('White! :D');
}
因为您将this
其放入$()
块内,所以结果是应用的任何进一步的 jQuery 链式方法都将针对this
您当前上下文中引用的 DOM 元素进行解析。然后,您将使用 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
});
问题是this
大多数 JavaScript 应用程序中的上下文经常发生变化,因此我认识的大多数程序员尽可能避免使用它。比上面更安全的是:
$('.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)')
并且 - 还有其他方法可以做到这一点,但其中任何一种都应该适用于您的目的。:)