当前位置: 首页 > web >正文

浏览器【详解】自定义事件 CustomEvent

简介

CustomEvent 是浏览器原生支持的一种事件类型,允许开发者自定义事件并在 DOM 中触发、监听,用于实现组件间通信或特定业务逻辑的解耦。

与浏览器内置事件(如 click、load)相比,CustomEvent 的核心优势是可以携带自定义数据,并能在任意 DOM 元素上触发和监听。

应用场景

  • 组件通信:在前端框架(如 Vue、React)中,非父子组件可通过自定义事件传递数据
  • 状态通知:如用户登录状态变化、数据加载完成等全局状态通知
  • 插件扩展:为自定义插件设计事件接口,允许外部监听插件内部状态变化

创建自定义事件 new CustomEvent

const myEvent = new CustomEvent(eventName, options);
  • eventName:事件名称(字符串,遵循命名规范,如 user-logindata-updated
  • options:配置对象(可选),包含:
    • detail:任意类型数据【只读】,作为事件的附加信息(最常用),要想修改,只能重新创建事件
    • bubbles:布尔值,是否冒泡(默认 false
    • cancelable:布尔值,是否可被取消(默认 false

触发(派发)事件 dispatchEvent

// 在 document 上触发自定义事件
document.dispatchEvent(myEvent);
// 在特定元素上触发
const myElement = document.getElementById('my-element');
myElement.dispatchEvent(myEvent);

监听自定义事件 addEventListener

// 监听 document 上的自定义事件
document.addEventListener('user-login', (event) => {console.log('用户登录了!', event.detail); // 访问自定义数据
});
// 监听特定元素的事件
myElement.addEventListener('data-updated', handleDataUpdate);

实战范例

// 1. 定义事件处理函数
function handleMessage(event) {console.log('收到消息:', event.detail);console.log('事件来源:', event.target);
}// 2. 监听自定义事件
document.addEventListener('custom-message', handleMessage);// 3. 创建并触发事件(可在任意位置执行)
const messageData = { content: 'Hello CustomEvent', timestamp: new Date().getTime() 
};// 创建事件,允许冒泡
const messageEvent = new CustomEvent('custom-message', {detail: messageData,bubbles: true
});// 在某个元素上触发(若 bubbles 为 true,会向上冒泡)
document.getElementById('sender').dispatchEvent(messageEvent);// 4. 移除事件监听(必要时)
// document.removeEventListener('custom-message', handleMessage);
http://www.xdnf.cn/news/16925.html

相关文章:

  • 台式机 Server 20.04 CUDA11.8
  • Linux 用户与组管理及权限委派
  • Blender 智能模型库 | 人物·建筑·场景·机械等 近万高精度模型
  • 嵌入式 Linux 深度解析:架构、原理与工程实践(增强版)
  • AG-UI 协议全面解析--下一代 AI Agent 交互框架医疗应用分析(上)
  • k8s云原生rook-ceph pvc快照与恢复(上)
  • NLP 和 LLM 区别、对比 和关系
  • 四、基于SpringBoot,MVC后端开发笔记
  • 【Mysql】联合索引生效分析案例
  • 【Electron】打包后图标不变问题,图标问题
  • JavaWeb笔记2-JavaScriptVueAjax
  • PyTorch分布式训练:从入门到精通
  • AG-UI 协议全面解析--下一代 AI Agent 交互框架医疗应用分析(下)
  • Js引用数据类型和ES6新特性
  • Python调用C++动态库
  • k8s云原生rook-ceph pvc快照与恢复(下)
  • 【Halcon 】Halcon 实战:如何为 XLD 模板添加极性信息以提升匹配精度?
  • iPhone 恢复出厂设置是否会删除所有内容?
  • 流式输出阻塞原因及解决办法
  • Pydantic模块学习
  • vivado扫盲:dcp(腾讯元宝)
  • QT6 源,十章绘图(2)画刷 QBrush:刷子只涉及填充颜色,线型,填充图片,以及变换矩阵这几个属性,附源代码带注释。
  • 从零到一:Linux内核MMU启动与虚拟内存体系建立全流程详解
  • gitlab+jenkins的ci/cd部署
  • win11 命令禁用客户体验改善计划
  • 区块链概述
  • 云计算k8s集群部署配置问题总结
  • ARM Cortex-M 处理器的应用
  • Hive SQL (HQL) 编辑指南
  • vscode cursor配置php的debug,docker里面debug