jQuery单击页面上除1 div以外的任何位置


Answers:


142

你可以申请clickbody文件和取消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

});

3
DIV中的后代孩子呢?
iKamy 2013年

2
我们可以使用最接近的事件源检查是否有ID为menu_content的任何祖先,例如if($(evt.target).closest('#menu_content')。length)retrun; 检查我更新的答案。
阿迪尔2014年

由于closest从当前元素开始,因此它既可以处理,也可以处理其menu_content后代。我认为第二if就是您所需要的。
goodeye

50

请参阅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
});

42

试试这个

 $('html').click(function() {
 //your stuf
 });

 $('#menucontainer').click(function(event){
     event.stopPropagation();
 });

您还可以使用 外部事件


5
这项工作,但是使用event.stopPropagation()可以对父级中包含的其他JS产生影响。
Edd Smith

9

我知道这个问题已经回答,并且所有答案都很好。但是,对于有类似(但不完全相同)问题的人,我想在这个问题上加上我的两分钱。

以更一般的方式,我们可以执行以下操作:

$('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
    }
});

1
我只是想说这种方法对我来说很好,我使用了.is()和.closest()以及一个css选择器,该选择器没有ID但只有一些类,谢谢您
修改了2016年

7

这是我所做的。想要确保我可以单击日期选择器中的任何孩子而不关闭它。

$('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();
    }
});

不错的版本,包括点击孩子和上课,应该是最好的选择!
rthus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.