【问题标题】:stopPropagation breaks event handlerstopPropagation 中断事件处理程序
【发布时间】:2014-09-09 04:47:36
【问题描述】:

在 javascript 中使用 stopPropagation 时,我有点头疼。根据many different sources stopPropagation 应该停止将事件冒泡到父元素,但是,当我使用它时,它似乎停止在第一次单击后调用事件。我编写了一段非常简单的代码来重现以下行为:

HTML:

<div id="root">
    <div id="top">
         <h1>Click Me!</h1>

    </div>
</div>

js/jQuery:

var myEvent = document.createEvent("Event");
myEvent.initEvent("boop", true, true);

$("#root").on('boop', function (e) {
    alert("root boop!");
});

$("#top").on('boop', function (e) {
    // After this is called, this event handler will never fire again.
    e.stopPropagation();
    alert("top boop!");
});

$("h1").click(function (e) {
    $("#top").get(0).dispatchEvent(myEvent);
    // I know that $("#top").trigger will prevent the problem, what is wrong with the form above?

});

还有一个Fiddle

【问题讨论】:

  • 我不明白你在问什么?在小提琴中,没有问题...?
  • @Karl-AndréGagnon 真的吗?所以每次点击都会弹出提示框?
  • 您没有在问题中指定,所以是的,我没有多次点击。阅读当前答案后,我现在明白了这个问题。下一次,解释如何重现问题;)
  • @Karl-AndréGagnon 来自问题:'......但是,当我使用它时,它似乎阻止了事件被调用......' 代码中有一条注释说明了它也是。下次,请阅读问题;)

标签: javascript jquery html


【解决方案1】:

您发送myEvent,最终您调用.stopPropagation()。此后的每次点击都使用已停止传播的 myEvent 的同一实例。

如果您希望能够多次点击,您需要在发送它之前make a copy of the event

...或者你可以像这样重写你的 JavaScript:

$("#root").on('boop', function (e) {
  alert("root boop!");
});

$("#top").on('boop', function (e) {
  e.stopPropagation();
  alert("top boop!");
});

$("h1").click(function (e) {
  var myEvent = document.createEvent("Event");
  myEvent.initEvent("boop", true, true);
  $("#top").get(0).dispatchEvent(myEvent);
});

Working JS Fiddle

【讨论】:

  • 如何复制这样的事件?
  • 您的回答向我解释了问题所在!你绝对值得一票
  • 只需将 createEvent 内容移动到点击处理程序中即可。
  • @A.R.这个问题涉及克隆事件对象:stackoverflow.com/q/12593035/810
  • 或者按照@dandavis的建议做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多