【问题标题】:javascript stopPropagation() prevents function from firingjavascript stopPropagation() 阻止函数触发
【发布时间】:2025-12-16 09:15:02
【问题描述】:

我有一个类 body_left_details 的子 div,它位于类 body_left_bar 的父 div 中。两个 div 都附加了一个 onclick 事件,但我想防止在单击 body_left_details 时出现 body_left_bar 冒泡。以下是相关代码:

$(function() {
    $('.body_left_bar').click(function() {
        body_right_load('parent');
    })
    $('.body_left_details').click(function(e) {
        e.stopPropagation();
        body_right_load('child');
    })
})
function body_right_load(str) {
    alert(str);
}​

足够简单。但是为什么当我点击body_left_details时,没有调用body_right_load('child')?我在 e.stopPropagation() 之后直接使用 alert() 进行了测试,效果很好。 stopPropagation 后是否不允许使用外部函数?这会被认为是冒泡吗?

在 Chrome 中的 Windows 7 wamp 上进行测试。任何见解都值得赞赏!

编辑:Relevant jsfiddle。单击父 div 将导致警报,但单击“阅读它”不会产生任何结果。

【问题讨论】:

  • 这可能与 body_right_load() 的声明方式真的有关。如果它真的看起来像您发布的内容,它会起作用。
  • 请提供一个演示问题的小提琴。
  • 确实,我已经稍微降低了总体布局,但我已将 body_right_load 更改为如上所示,但仍然没有触发。给我一分钟小提琴。
  • jsfiddle.net/nqFH4 就像一个魅力。
  • Uncaught ReferenceError: aid is not defined(第 ~38 行)

标签: javascript jquery stoppropagation


【解决方案1】:
$(function() {
    $('.body_left_bar').on('click', function() {
        body_right_load('parent');
    })
    $('.body_left_details').on('click', function(e) {
        e.stopImmediatePropagation();
        body_right_load('child');
    })
})
function body_right_load(str) {
    alert(str);
}​

【讨论】:

  • api.jquery.com/on "。处理程序可以通过调用 event.stopPropagation() 来防止事件在文档树上进一步冒泡(从而防止这些元素上的处理程序运行)。附加的任何其他处理程序但是,当前元素将运行。为防止这种情况发生,请调用 event.stopImmediatePropagation()。(绑定到元素的事件处理程序的调用顺序与它们绑定的顺序相同。)"
  • 我再问一次,这与原始发布的代码有何不同? .body_left_details 附加的事件不超过 1 个,因此使用 stopImmediatePropagation 不应与 stopPropagation 不同,除非(我不确定这一点)看起来(从您粘贴的文档中)stopImmediatePropagation仍然会在父元素上运行点击事件(换句话说,它会传播,只是不会传播到同一元素上的处理程序),但我在这一点上可能是错误的。
  • Bravo @Wade,看来你已经破解了密码! stopImmediatePropagation 与 stopPropagation 实现相同,但使用“on”似乎已经解决了它。谢谢!
  • .click() 更改为.on() 没有任何区别。 OP 在小提琴中发布的代码已经有效(一旦修复了明显的不相关错误)。