为啥用 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 触发定义的事件不遵守事件的冒泡行为?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript自定义事件和触发(createEvent, dispatchEvent)
javascript事件触发器fireEvent和dispatchEvent