如何在复选框单击时停止事件冒泡

ror*_*ryf 171 javascript checkbox jquery events

我有一个复选框,我想对click事件执行一些Ajax操作,但是复选框也在一个容器内,它有自己的点击行为,当我点击复选框时我不想运行它.此示例说明了我想要做的事情:

$(document).ready(function() {
  $('#container').addClass('hidden');
  $('#header').click(function() {
    if ($('#container').hasClass('hidden')) {
      $('#container').removeClass('hidden');
    } else {
      $('#container').addClass('hidden');
    }
  });
  $('#header input[type=checkbox]').click(function(event) {
    // Do something
  });
});
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何停止事件冒泡而不会导致默认点击行为(复选框变为选中/取消选中)不运行.

以下两个都会停止事件冒泡,但也不会更改复选框状态:

#container.hidden #body {
  display: none;
}
Run Code Online (Sandbox Code Playgroud)

rah*_*hul 322

更换

event.preventDefault();
return false;
Run Code Online (Sandbox Code Playgroud)

event.stopPropagation();
Run Code Online (Sandbox Code Playgroud)

event.stopPropagation()

停止将事件冒泡到父元素,从而阻止任何父处理程序被通知事件.

event.preventDefault()

阻止浏览器执行默认操作.使用方法isDefaultPrevented来了解是否曾调用此方法(在该事件对象上).

  • 由于某种原因,这对我不起作用,但是返回false. (4认同)
  • 如果使用`.live()`方法绑定事件,那么这将不起作用.你将不得不使用`return false;`本身. (3认同)
  • 这可以使用jQuery的`.on()`方法(现在不推荐使用).我无法弄清楚为什么返回false不起作用. (2认同)

小智 32

使用stopPropagation方法:

event.stopPropagation();
Run Code Online (Sandbox Code Playgroud)


Far*_*ini 29

别忘了IE:

if (event.stopPropagation) {    // standard
        event.stopPropagation();
    } else {    // IE6-8
        event.cancelBubble = true;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是从2012年开始的.2015年请忘记IE. (20认同)
  • 这也适用于IE9.我的IE9测试机器在stopPropagation()上窒息,但是喜欢cancelBubble().令人遗憾的是,有些人/组织在2016年仍在使用IE9.我们这些有企业客户的人不能忽视这一点. (8认同)

pei*_*rix 5

正如其他人所说,试试吧stopPropagation().

并且还有第二个处理程序要尝试:event.cancelBubble = true;它是一个IE特定的处理程序,但它至少支持FF.我真的不太了解它,因为我自己没有使用它,但如果一切都失败了,它可能值得一试.


小智 5

这是理解事件冒泡概念的一个很好的例子.根据以上答案,最终代码将如下所述.在用户单击复选框的情况下,将使用停止事件传播到其父元素"标题" event.stopPropagation();.

$(document).ready(function() {
            $('#container').addClass('hidden');
            $('#header').click(function() {
                if($('#container').hasClass('hidden')) {
                    $('#container').removeClass('hidden');
                } else {
                    $('#container').addClass('hidden');
                }
            });
          $('#header input[type=checkbox]').click(function(event) {
              if (event.stopPropagation) {    // standard
                   event.stopPropagation();
               } else {    // IE6-8
                    event.cancelBubble = true;
               }
          });     
  });
Run Code Online (Sandbox Code Playgroud)


Dut*_*evv 5

使用jQuery时,您不需要单独调用stop函数.

你可以只false在事件处理程序中

这将停止事件并取消冒泡..

另见:

event.preventDefault()与return false

来自jQuery文档:

因此,这些处理程序可以通过调用event.stopPropagation()或返回false来阻止委托处理程序触发.