自定义事件默认不冒泡,必须在构造时通过 options 对象显式设置 bubbles: true 才能生效,如 new event('e', {bubbles: true});触发需调用 dispatchevent(),监听可直接用 addeventlistener,冒泡阶段自动传递。

默认情况下,自定义事件(通过 CustomEvent 或 Event 构造函数创建)**不会冒泡**,即使你手动设置 bubbles: true,也必须在构造时正确传入配置对象,否则无效。
确保 bubbles 参数生效的关键:用 Event 构造函数或 CustomEvent 的 options 对象
直接写 new Event('myevent', { bubbles: true }) 是最简洁可靠的方式。注意:不能只传字符串,必须传第二个参数(options 对象),且其中明确包含 bubbles: true。
-
错误写法:
new Event('myevent')—— 此时bubbles默认为false -
正确写法:
new Event('myevent', { bubbles: true }) - 使用
CustomEvent同样有效:new CustomEvent('myevent', { bubbles: true, detail: { msg: 'hello' } })
触发后需在目标元素上调用 dispatchEvent
创建事件对象只是第一步,你还得显式调用 element.dispatchEvent()。冒泡行为由事件系统自动处理,前提是该事件对象本身支持冒泡(即 bubbles === true)且目标元素是 DOM 节点。
- 例如:
document.getElementById('child').dispatchEvent(new Event('notify', { bubbles: true })) - 此时若父元素(如
#parent)监听了'notify',且未阻止冒泡,就会收到该事件
监听时无需特殊操作,普通 addEventListener 即可捕获冒泡阶段
只要事件带 bubbles: true,上层元素用标准方式监听即可在冒泡阶段接收到:
-
parent.addEventListener('notify', handler)—— 默认就是捕获冒泡阶段 - 如果想在捕获阶段监听,加第三个参数
true:parent.addEventListener('notify', handler, true) - 注意:自定义事件的
composed属性(用于 Shadow DOM 穿透)与此无关,除非涉及 Web Components
验证是否真的冒泡:检查 event.eventPhase 和 event.target
在事件处理器中,可通过以下方式确认冒泡是否发生:
-
event.eventPhase === Event.BUBBLING_PHASE表示当前处于冒泡阶段 -
event.target始终是最初触发事件的元素;event.currentTarget是当前绑定监听器的元素 - 比如子元素触发、父元素监听,父元素中
event.target是子元素,event.currentTarget是父元素










