jQuery $(' html,body')。not()

时间:2012-10-18 15:55:46

标签: jquery click

here - 当你点击任何地方而不是div时,我希望发生警报。

当我点击div时,警报也会显示。

JS

$("html, body").not('.entry-content').click(function() {            
    alert('d');                        
}); ​

HTML

<div class="entry-content"> kkkk </div>​

4 个答案:

答案 0 :(得分:17)

您可以使用event参数查看单击的目标并返回false

$("html, body").click(function(e) {
    if ($(e.target).hasClass('entry-content')) {
        return false;
    }
    alert('d');
});​

http://jsfiddle.net/keyZw/

您正在使用.not()过滤器..但它仍然是您的html / body的一部分..因此您需要在click函数内处理它。你也只是绑定点击事件..

所以

 // find html,body - not ones with class=entry-content - bind click
 $("html, body").not('.entry-content')

因此,当你的div仍在体内时,这不会阻止警报

如上所述..你只需要真正绑定到身体

$("body").click(function(e) {
    if ($(e.target).hasClass('entry-content')) {
        return false;
    }
    alert('d');
});​

答案 1 :(得分:7)

$("html *").click(function(e) {
    if ( e.target.className.indexOf("entry-content") < 0 ) {
        alert('d');
    }
}); 

DEMO


原始代码不起作用,因为.not()适用于它前面的选择器 - htmlbody。它们都没有entry-content类,所以事件触发

答案 2 :(得分:2)

您还可以在点击的元素上停止传播

$("body").click(function() {
    alert();
});

$(".entry-content").click(function(e) {
    e.stopPropagation();
});

也可以点击子元素

<div class="entry-content">Element
  <span>Sub element</span>
</div>​

查看Fiddle

答案 3 :(得分:0)

问题是您要将click事件添加到HTML和BODY标记中。所以,首先,当您点击身体区域时,您将收到2个警报。此外,由于事件传播的方式,单击有问题的DIV会将click事件传播到body和html。因此,您需要在点击处理程序中进行检查,以确定是否要显示警报消息。

我修改了下面的jsfiddle,只在选择器中包含HTML,并检查处理程序中的entry-content类。

http://jsfiddle.net/m2eqS/6/

$("html").click(function(e) {
    if(!$(e.target).hasClass("entry-content")){
      alert('TEST');
   }                        
}); ​

绑定到HTML和BODY之间的区别在于,如果您希望能够单击页面上的任何位置,在内容/正文结束的位置下方,则应使用HTML。否则使用BODY。