如何使用全局选择器响应除一个元素之外的所有单击事件?

fri*_*ton 2 javascript jquery global css-selectors

如果我有一个按钮:

<button id="button1">
Run Code Online (Sandbox Code Playgroud)

通常我会写:

$("#button1").click(function ()
{    
    //do something
}
Run Code Online (Sandbox Code Playgroud)

但我想定义一个响应所有点击事件的功能,除非有人点击此按钮.

是否有一个选择器允许我定位文档中的所有其他可点击元素除外button1

CMS*_*CMS 7

你可以使用:not selector:

$('button:not(#button1)').click(function(){
  //Do something
});
Run Code Online (Sandbox Code Playgroud)

上面的选择器将匹配除id ="button1"之外的所有按钮元素.

如果你真的要选择body标签下的所有元素,你可以使用"All"(*)选择器,也可以使用:not(selector).not(expr)排除元素:

$('body *:not(#button1)').click(function(){
  //Do something
});
Run Code Online (Sandbox Code Playgroud)

要么

$('body *').not('#button1').click(function(){
  //Do something
});
Run Code Online (Sandbox Code Playgroud)

如果这样做,您可能会遇到一些事件冒泡或传播问题,您可以使用event.stopPropagation函数处理此问题.

  • 不是一个好的解决方案 您最终可能会附加100个点击事件.事件委派最好在这里检查event.target (3认同)

red*_*are 6

我知道你已经接受了上面的答案,但我会强烈反对这一点.您可以使用事件委派来执行您想要的操作,同时减少dom的开销.

我知道.live()存在但是太多的实时处理程序也会影响性能.我更喜欢事件代表旧式.

在这里演示

$(function(){
    $('body').click( clickFn );
  });

  function clickFn( ev ) {

    if (ev.target.id != 'button1' ){
       //do your stuff
       console.log('not a #button1 click');
    }

  }
Run Code Online (Sandbox Code Playgroud)

  • 事件委托通过live() - > http://docs.jquery.com/Events/live直接进入jQuery (2认同)