jquery停止孩子触发父事件

Joh*_*ohn 197 jquery

我有一个div,我附上了一个onclick事件.在这个div中有一个带链接的标签.当我点击链接时,onclick也会触发div中的事件.如何禁用此功能,以便在单击链接时onclick不会触发div ?

脚本:

$(document).ready(function(){
    $(".header").bind("click", function(){
         $(this).children(".children").toggle();
    });
})
Run Code Online (Sandbox Code Playgroud)

HTML代码:

<div class="header">
    <a href="link.html">some link</a>
    <ul class="children">
        <li>some list</li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 392

做这个:

$(document).ready(function(){
    $(".header").click(function(){
        $(this).children(".children").toggle();
    });
   $(".header a").click(function(e) {
        e.stopPropagation();
   });
});
Run Code Online (Sandbox Code Playgroud)

如果你想了解更多关于.stopPropagation()的信息,请看这里.

  • xr280xr的以下答案要好得多,因为它不会干扰孩子的可能事件。 (5认同)
  • @ehsan你的意思是:"或者它不起作用"? (3认同)
  • 如果它对某人有帮助,我用`$(".header*")替换`$(".header a")``并选择任何子项(div,form,input等). (2认同)
  • e.stopPropagation(); 必须写在第一行,除非它不起作用! (2认同)
  • 不幸的是,这种方法阻止了配置为rel的灯箱起作用 (2认同)
  • 你创造的问题多于你解决的问题。想象一下第三方插件监听文档元素上的点击事件。他们永远不会知道这些点击。请参阅有关灯箱的评论。 (2认同)

xr2*_*0xr 92

或者,您可以使用传递给Click事件处理程序的Event Object参数来确定是否单击了子项,而不是使用额外的事件处理程序来阻止其他处理程序.target将是单击的元素,currentTarget将成为.header div:

$(".header").click(function(e){
     //Do nothing if .header was not directly clicked
     if(e.target !== e.currentTarget) return;

     $(this).children(".children").toggle();
});
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这是一个更优雅的解决方案,因为您不必为每个子元素添加显式的preventDefault(). (6认同)
  • 如果您对孩子有独立的活动,那么它就会有效.绝对更清洁,更好的解决方案 (4认同)
  • 在大多数情况下你不会关心这个,但如果你出于什么原因需要支持IE6-8,他们[没有`currentTarget`](https://developer.mozilla.org/en-US/docs/Web/API /事件/ currentTarget)中.解决方法是将其替换为"this",如[另一个答案](http://stackoverflow.com/a/6411507/2737565)中所述. (2认同)

Roh*_*mar 16

使用on()和链接更好的方式,

$(document).ready(function(){
    $(".header").on('click',function(){
        $(this).children(".children").toggle();
    }).on('click','a',function(e) {
        e.stopPropagation();
   });
});
Run Code Online (Sandbox Code Playgroud)


Daa*_*aan 5

我偶然发现了这个问题,正在寻找另一个答案。

我想防止所有孩子触发父母。

JavaScript:

document.getElementById("parent").addEventListener("click", function (e) {
    if (this !== event.target) return;
    // Do something
});
Run Code Online (Sandbox Code Playgroud)

jQuery:

$("#parent").click(function () {
    // Do something
}).children().on("click", function (e) {
    e.stopPropagation();
});
Run Code Online (Sandbox Code Playgroud)