Javascript jQuery—为什么即使在调用了“e.preventDefault”之后,委托也会传播?

Javascript jQuery—为什么即使在调用了“e.preventDefault”之后,委托也会传播?,javascript,jquery,Javascript,Jquery,我有一个带有嵌套链接的div。div有一个委托处理程序,用于'click',它会提醒“div”。div中的链接还有一个委托处理程序,用于'click',其中e.preventDefault()。单击链接时,我会看到“Div”警报和“Div”警报。我不清楚为什么会发生这种情况,因为我正试图阻止链接的点击处理程序的传播 JavaScript HTML 您应该使用e.stopPropagation()来阻止事件冒泡 PreventDefault不会停止传播,它会停止执行默认操作 返回false/sto

我有一个带有嵌套链接的div。div有一个
委托
处理程序,用于
'click'
,它会提醒“div”。div中的链接还有一个
委托
处理程序,用于
'click'
,其中
e.preventDefault()。单击链接时,我会看到“Div”警报和“Div”警报。我不清楚为什么会发生这种情况,因为我正试图阻止链接的点击处理程序的传播

JavaScript HTML
您应该使用
e.stopPropagation()
来阻止事件冒泡

  • PreventDefault不会停止传播,它会停止执行默认操作
  • 返回false/stopPropagation对委托/活动事件不起作用,因为当它到达定义事件的元素时,它已经向上传播。它将停止向DOM中较高级别的元素的传播,但不会阻止调用相同级别(或更低级别)的处理程序。从文档中可以看到这一点

    因为.live()方法在事件传播到 在文档的顶部,无法停止的传播 现场活动。类似地,由.delegate()处理的事件将传播 委托给他们的要素;绑定到上的事件处理程序 DOM树中它下面的任何元素都将已经执行 在调用委托事件处理程序时。这些处理者, 因此,可以通过以下方式防止委托处理程序触发: 调用event.stopPropagation()或返回false

  • 如果不希望同一级别/DOM元素的其他处理程序运行,可以使用stopImmediatePropagation。请注意,应用处理程序的顺序很重要

  • 您可能应该使用,而不是jquery1.7中的delegate/live
  • $('body').delegate('.outer', 'click', function(e){
        e.preventDefault();
        alert('Div');
    });
    
    $('body').delegate('.outer a', 'click', function(e){
        e.preventDefault();
        alert('Link');
        // Note: I've also tried returning false (vs using preventDefault), per the docs
    });
    
    <div class="outer">
        <a href="#">Click me</a>
    </div>