当我单击页面上除div(id=menu_content
)以外的任何位置时,如何触发功能?
当我单击页面上除div(id=menu_content
)以外的任何位置时,如何触发功能?
Answers:
你可以申请click
对body
文件和取消click
处理,如果click
是由ID为DIV生成的事件menu_content
,这将绑定事件到单个元素和节约的结合click
与除每一个元素menu_content
$('body').click(function(evt){
if(evt.target.id == "menu_content")
return;
//For descendants of menu_content being clicked, remove this check if you do not want to put constraint on descendants.
if($(evt.target).closest('#menu_content').length)
return;
//Do processing of click event here for every element except with id menu_content
});
closest
从当前元素开始,因此它既可以处理,也可以处理其menu_content
后代。我认为第二if
就是您所需要的。
请参阅jQuery Event Target的文档。使用事件对象的target属性,您可以检测单击在#menu_content
元素内的起源,如果是,则尽早终止单击处理程序。您将不得不.closest()
处理点击起源于的后代的情况#menu_content
。
$(document).click(function(e){
// Check if click was triggered on or within #menu_content
if( $(e.target).closest("#menu_content").length > 0 ) {
return false;
}
// Otherwise
// trigger your click function
});
我知道这个问题已经回答,并且所有答案都很好。但是,对于有类似(但不完全相同)问题的人,我想在这个问题上加上我的两分钱。
以更一般的方式,我们可以执行以下操作:
$('body').click(function(evt){
if(!$(evt.target).is('#menu_content')) {
//event handling code
}
});
这样,我们不仅可以处理由具有id的menu_content
元素以外的任何事物触发的事件,还可以处理由我们可以使用CSS选择器选择的任何元素之外的任何事物触发的事件。
例如,在下面的代码片段中,我将获取除所有<li>
元素(均为id的div元素的后代)以外的任何元素触发的事件myNavbar
。
$('body').click(function(evt){
if(!$(evt.target).is('div#myNavbar li')) {
//event handling code
}
});
这是我所做的。想要确保我可以单击日期选择器中的任何孩子而不关闭它。
$('html').click(function(e){
if (e.target.id == 'menu_content' || $(e.target).parents('#menu_content').length > 0) {
// clicked menu content or children
} else {
// didnt click menu content
}
});
我的实际代码:
$('html').click(function(e){
if (e.target.id != 'datepicker'
&& $(e.target).parents('#datepicker').length == 0
&& !$(e.target).hasClass('datepicker')
) {
$('#datepicker').remove();
}
});