You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何点击事件中的e.stopPropagation()函数无法生效?

为什么e.stopPropagation()无法生效?

你的问题核心在于事件绑定方式和事件冒泡的执行顺序,具体原因如下:

  • 父元素.el用的是内联onclick(DOM0级事件),这种事件会在事件冒泡到.el元素时立即触发执行。
  • 子元素.stop的点击事件是通过$(document).on()实现的事件委托,事件委托依赖事件冒泡机制:当点击.stop后,事件会一路冒泡到document节点,此时才会触发你绑定的处理函数。

实际执行顺序是:
点击.stop → 事件冒泡到.el → 触发.el的onclick弹出alert(1) → 事件继续冒泡到document → 触发.stop的委托处理函数,此时调用e.stopPropagation()已经无效——父元素的事件早就执行完毕了。


解决方法

方法1:统一用事件委托绑定所有事件

把父元素的事件也改成委托绑定,这样所有事件处理函数都会在冒泡到document时按顺序触发,此时stopPropagation()就能阻止后续冒泡(父元素的委托事件不会执行):

$(document).ready(function() {
  var el = '<div class="el"><div class="stop">X</div>Click</div>';
  $("body").append(el);
})

// 父元素的事件也用委托绑定
$(document).on("click", ".el", function() {
  alert(1);
});

$(document).on("click", ".stop", function(e) {
  e.stopPropagation();
  alert(2);
});

方法2:直接绑定子元素的事件(不用委托)

如果要保留内联onclick,可以直接把.stop的事件绑定到元素本身,这样事件处理函数会在事件冒泡到.el之前触发,阻止冒泡后父元素的onclick就不会执行了:

$(document).ready(function() {
  var el = '<div class="el" onclick="alert(1);"><div class="stop">X</div>Click</div>';
  $("body").append(el);
  
  // 直接绑定到创建后的.stop元素
  $(".stop").on("click", function(e) {
    e.stopPropagation();
    alert(2);
  });
});

内容的提问来源于stack exchange,提问作者Vans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:21:48