试图使以下工作无济于事:.remove
仅当单击的内容不包含时,才使用该类淡出所有元素.completed
$(document).on('click', ':not(.completed)', function(){
$('.remove').fadeOut('fast');
});
试图使以下工作无济于事:.remove
仅当单击的内容不包含时,才使用该类淡出所有元素.completed
$(document).on('click', ':not(.completed)', function(){
$('.remove').fadeOut('fast');
});
我发现这是一个 jQuery 问题:
仅使用:not(.class)
它不能正常工作。这个 jsfiddle演示了它。
如果您的.completed
元素具有相同的标签名称,您可以添加tagname:not("completed")
哪个有效(为什么?!)。
在我的示例中,它们是按钮,因此选择器变为button:not('.completed')
.
$(document).on('click', 'button:not(.completed)', function(e){
$('.remove').fadeOut('fast');
});
另一种解决方案是验证单击的元素是否hasClass('completed')
。
if ($(e.srcElement).hasClass("completed")) { return; }
如果所有.completed
元素都是div
s,则将选择器替换为div:not('completed')
。
也可以在这里创建一个问题。它会得到解决。
on()
您需要检查实际点击目标是否已完成该类,由于事件冒泡,无法使用元素过滤器完成
jQuery(function($){
$(document).click(function(e){
if(!$(e.target).is('.completed')){
$('.remove').remove()
}
})
})
演示:小提琴
:not(.completed)
匹配<html>
,<body>
以及页面上的其他所有人。
这意味着click()
将绑定到每个没有类的元素.completed
(包括<html>
and <body>
),而不仅仅是你想要的button
// input
。div
由于:not(.completed)
绑定<body>
and <html>
,为了避免它们,您必须:
:not(.completed, body, html)
但是,如果您的预期button
//在 a 下input
,那也将受到约束。你必须避免它:div
table
table
:not(.completed, body, html, table)
如您所见,这迅速增长。最简单的方法是积极缩小选择器的范围:
.clicableDivs:not(.completed) OR input:not(.completed)
什么适合你。底线::not(.completed)
匹配太多。缩小范围。
我有一种感觉,您需要做的是 add ev.stopPropagation()
,因为这将通过 DOM 继续上升。
$(document).on('click', ':not(.completed)', function(ev){
ev.stopPropagation();
$('.remove').fadeOut('fast');
});
或者可能,首先检查目标是否没有.completed
父母,如下所示:
$(document).on('click', function(ev){
if ( ! $(ev.target).closest('.completed').length ) {
ev.stopPropagation();
$('.remove').fadeOut('fast');
}
});
这是一个显示此工作的小提琴:http: //jsfiddle.net/C5vqw/