为啥用 dispatchEvent 触发定义的事件不遵守事件的冒泡行为?

Posted

技术标签:

【中文标题】为啥用 dispatchEvent 触发定义的事件不遵守事件的冒泡行为?【英文标题】:Why firing a defined event with dispatchEvent doesn't obey the bubbling behavior of events?为什么用 dispatchEvent 触发定义的事件不遵守事件的冒泡行为? 【发布时间】:2014-05-27 17:14:10 【问题描述】:

我对下面的脚本感到困惑:

var event = new Event('shazam');

document.body.addEventListener('shazam',function()
    alert('body');
);

document.addEventListener('shazam',function()
    alert('document');
);

window.addEventListener('shazam',function()
    alert('window');
);

document.body.dispatchEvent(event);

当我在浏览器上运行此脚本时,我只会收到 alert('body'); 事件。 但是如果我将 addEventListener 的捕获参数(第三个可选参数)设置为 true,则所有警报都会按应有的顺序捕获。

为什么 shazam 事件 没有冒泡?

【问题讨论】:

创建一个CustomEvent而不是Event并将true作为第二个参数(canBubble参数)传递 该属性似乎不叫'canBubble',它是'bubbles'。 【参考方案1】:

您需要将bubbles属性设置为true,并且在构建过程中必须这样做:

var event = new Event('shazam',  bubbles: true );

或者使用 initEvent 的旧方法,将 true 作为第二个参数传递以允许冒泡:

event.initEvent('shazam', true);

MDN Doc

【讨论】:

感谢您的简短回复 :) 但是有一个问题:为什么在事件对象中默认禁用冒泡。 它默认为 false 根据 dom.spec.whatwg.org/#interface-event (或者,如果您愿意,developer.mozilla.org/en-US/docs/Web/API/Event/Event )。我猜这是在默认情况下提供具有最小潜在副作用的选项。

以上是关于为啥用 dispatchEvent 触发定义的事件不遵守事件的冒泡行为?的主要内容,如果未能解决你的问题,请参考以下文章

自定义事件的触发dispatchEvent

自定义事件的触发dispatchEvent

JavaScript自定义事件和触发(createEvent, dispatchEvent)

javascript事件触发器fireEvent和dispatchEvent

为啥在 dispatchEvent 上不调用 React 事件处理程序?

IE中的fireEvent和webkit中的dispatchEvent