我有一个复选框,我想在单击事件上执行一些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="https://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;

当前回答

这里有一个对我有用的技巧:

handleClick = e => {
    if (e.target === e.currentTarget) {
        // do something
    } else {
        // do something else
    }
}

解释:我把handleClick附加到一个模式窗口的背景,但它也在模式窗口内的每次点击(因为它是在背景div)。所以我添加了条件(e.target === e.currentTarget),这只在单击背景时才会实现。

其他回答

在angularjs中,这应该是有效的:

event.preventDefault(); 
event.stopPropagation();

使用stopPropagation方法:

event.stopPropagation();

取代

event.preventDefault();
return false;

with

event.stopPropagation();

event.stopPropagation ()

停止事件的冒泡 父元素,阻止任何父元素 处理程序不被通知 事件。

event.preventDefault ()

阻止浏览器执行 默认动作。使用方法 isdefaultprevent来知道是否 此方法曾经被调用(在此 事件对象)。

这是理解事件冒泡概念的一个极好的示例。基于上面的答案,最终的代码如下所示。当用户单击复选框时,事件传播到其父元素“header”将使用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;
               }
          });     
  });

代码由@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>