我想要隐藏在mousedown
之外的叠加层。
以下是我尝试过但不幸的是:not
选择器无法正常工作。
$('body:not(.overlay)').one('mousedown',function(){
//hide overlay here
});
我也试过了$('* :not(.overlay)')
但同样的问题。
即使在叠加框内单击
,叠加层也会隐藏答案 0 :(得分:4)
$(document).on( "mousedown.hideoverlay", function(e){
if( $(e.target).closest(".overlay").length === 0 ) { //overlay wasn't clicked.
//hide overlay
$(document).off("mousedown.hideoverlay");
}
});
答案 1 :(得分:2)
你的选择器body:not(.overlay)
匹配body元素,如果它没有类overlay
,我假设你的意思是它的后代没有类overlay
:
$('body :not(.overlay)'); //note the space - descendant selector
这种赋值的问题在于它匹配太多元素(特别是所选元素的父元素)。 Tehnically,即使点击任何容器div
也会匹配选择器fiddled。发生这种情况是因为即使点击具有overlay
类的元素,也会继续向上传播DOM。
我同意这里的其他建议,即如果选择器不匹配则听取所有点击并什么都不做是合适的,但是防止事件在它们上传播会干扰页面的其余部分逻辑
我宁愿提倡一种方法,即可以点击“可叠加”项目的明确子集 - 并使用:not(.overlay)
选择器对其进行过滤:
$('.some-generic-container-name:not(.overlay)')...
答案 2 :(得分:1)
尝试.not()函数:http://api.jquery.com/not/。它专门从选定的组中删除元素,这可能是您在这里遇到的问题。保存必须做复杂的if等解决这个问题
$('*').not('.overlay').on('mousedown', function(){
alert("here");
});
$(document).on('mousedown', function(e){
var target = $(e.target);
if(!target.parents().hasClass('overlay') && !target.hasClass('overlay')){
// hide stuff
}
});
编辑:我更喜欢点击这里(不知道为什么):
$(document).on('click', function(e){
var target = $(e.target);
if(!target.parents().hasClass('overlay') && !target.hasClass('overlay')){
// hide stuff
}
});
在我看来它看起来更好,叫我奇怪......