直接在window上用dispatchEvent触发自定义消息通知,核心是创建带数据的CustomEvent并派发到全局作用域;通过new CustomEvent('type',{detail:data})创建事件,window.dispatchEvent()派发,可统一封装为window.emit()函数,监听时用window.addEventListener('type',e=>e.detail)获取数据。

直接在 window 上用 dispatchEvent 触发自定义消息通知,核心是创建带数据的 CustomEvent 并派发到全局作用域。这种方式轻量、无依赖,适合跨模块或微前端场景下的简单通信。
创建并触发带参数的自定义事件
使用 CustomEvent 构造器创建事件,把通知内容放在 detail 字段里,这是标准且推荐的方式:
- 用
new CustomEvent('notify', { detail: { title: '系统提示', content: '操作成功' } })创建事件 - 调用
window.dispatchEvent(event)派发到全局 -
bubbles: true可选,若需事件冒泡到 document 或 body 可开启(一般通知类不需) -
cancelable: true可选,仅当需要监听方能调用e.preventDefault()阻止后续逻辑时才设为 true
统一封装全局触发函数
避免每次重复写创建逻辑,可挂载一个简易工具方法到 window:
window.emit = (type, data) => window.dispatchEvent(new CustomEvent(type, { detail: data }))- 调用示例:
window.emit('app:login-success', { userId: 1001, token: 'abc123' }) - 注意:不要覆盖已有属性(如已存在
window.emit,建议加命名空间,例如window.appEmit)
在任意位置监听该通知
监听方只需在 window 上注册对应类型的事件监听器:
window.addEventListener('app:login-success', e => console.log('收到登录成功通知:', e.detail))- 监听器中通过
e.detail获取传入的全部数据,类型安全、结构清晰 - 若监听逻辑只执行一次,可用
{ once: true }选项自动解绑
注意事项和常见误区
这类全局事件不是“广播”也不是“发布订阅”,它本质是 DOM 事件机制的延伸:
- 只在当前窗口/文档内生效,不能跨 iframe(除非同源且显式访问目标
window)或跨标签页 - 不保证监听器一定已注册——如果事件先于监听器注册发生,会丢失(无事件队列)
- 避免滥用高频事件名(如
update、change),建议加前缀区分用途,例如ui:toast、auth:token-expired - 不要用
document.createEvent+initEvent,那是旧 API,现代浏览器优先用CustomEvent

















