开发者问题收集

stopPropagation 中断事件处理程序

2014-08-18
404

在 javascript 中使用 stopPropagation 时,我有点头疼。根据 许多 不同的 来源 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

1个回答

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

如果您希望能够多次点击,则需要在分派事件之前 复制事件

...或者您可以像这样重写 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);
});

工作 JS Fiddle

mbillard
2014-08-18