为什么使用dispatchEvent触发定义的事件不遵循事件的冒泡行为?

Shn*_*hnd 17 javascript events event-bubbling dispatchevent

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

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);
Run Code Online (Sandbox Code Playgroud)

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

为什么shazam事件不会冒泡?

Pat*_*ans 31

您需要将该bubbles属性设置为true,并且必须在构造期间执行此操作:

var event = new Event('shazam', { bubbles: true });
Run Code Online (Sandbox Code Playgroud)

或旧的方式initEvent,传递真作为允许泡沫的第二个参数:

event.initEvent('shazam', true);
Run Code Online (Sandbox Code Playgroud)

MDN Doc

  • 根据 https://dom.spec.whatwg.org/#interface-event 默认为 false (或者,如果您愿意,https://developer.mozilla.org/en-US/docs/Web/API/Event /事件 )。我猜这是为了默认提供潜在副作用最小的选项。 (3认同)