Javascript jQuery—为什么即使在调用了“e.preventDefault”之后,委托也会传播?
我有一个带有嵌套链接的div。div有一个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
委托
处理程序,用于'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>