如何停止复选框上的事件冒泡


182

我有一个复选框,我想对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
  });
});
#container.hidden #body {
  display: none;
}
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<div id="container">
  <div id="header">
    <h1>Title</h1>
    <input type="checkbox" name="test" />
  </div>
  <div id="body">
    <p>Some content</p>
  </div>
</div>

但是,我不知道如何在不导致默认点击行为(复选框变为选中/未选中)的情况下停止事件冒泡。

以下两项都停止了事件冒泡,但也没有更改复选框状态:

event.preventDefault();
return false;

2
我发现了一篇有关此问题的文章,可能会对其他Stack Overflowers有所帮助。快速提示:单击“表行”以触发复选框单击
Peder Rice 2010年

Answers:


341

更换

event.preventDefault();
return false;

event.stopPropagation();

event.stopPropagation()

停止将事件冒泡到父元素,从而防止任何父处理程序收到该事件的通知。

event.preventDefault()

阻止浏览器执行默认操作。使用isDefaultPrevented方法可以知道是否曾经(在该事件对象上)调用过此方法。


4
由于某种原因,这对我不起作用,但返回false确实有效。
兰迪L

3
如果您使用.live()方法绑定事件,则此方法将无效。您将不得不使用return false;自己。
rahul 2010年

2
这可以使用jQuery的.on()方法工作(现在不建议使用live)。我不知道为什么返回false无效。
styfle 2012年

我花了很长时间才弄清楚event.preventDefault()在IE8中没有显示复选标记,但在其他浏览器中运行良好。我修复后找到了这个答案,然后使用preventDefault,IE8,复选框作为关键字,将我带到这里。
signonsridhar

没用..,但是这两行做到了(没有返回false)-> event.preventDefault(); event.stopPropagation();
Kugan Kumar


29

别忘了IE:

if (event.stopPropagation) {    // standard
        event.stopPropagation();
    } else {    // IE6-8
        event.cancelBubble = true;
}

23
这个答案是从2012年开始的。2015年,请不要忘记IE。
Taylan 2015年

8
这也适用于IE9。我的IE9测试机在stopPropagation()上感到窒息,但喜欢cancelBubble()。不幸的是,一些人/组织在2016年仍在使用IE9。我们这些拥有公司客户的人不能忽视这一点。
克里斯·科伯

我爱2019
SuperUberDuper

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;
               }
          });     
  });

5

使用jQuery时,您无需单独调用stop函数。

你可以回来 false事件处理程序

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

另请参阅event.preventDefault()与return false

从jQuery文档中:

因此,这些处理程序可能会通过调用event.stopPropagation()或return 阻止委托处理程序触发false


1

感谢@mehras的代码。我只是创建了一个片段来演示它,因为我认为这会受到赞赏,并且我想找个借口尝试该功能。

$(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;
    }
  });
});
div {
  text-align: center;
  padding: 2em;
  font-size: 1.2em
}

.hidden {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="header"><input type="checkbox" />Checkbox won't bubble the event, but this text will.</div>
<div id="container">click() bubbled up!</div>


实际显示如何使用事件变量的代码,谢谢。
Moshe Binieli,

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.