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

JavaScript 事件流:事件捕获和事件冒泡

一、什么是事件流

当用户与网页交互时(如点击按钮),事件并不是只在触发元素上发生,而是会经历一个完整的传播过程,这个过程称为事件流

二、事件流的三个阶段

(1)捕获阶段:从最外层的 window 对象向内传播到目标元素

(2)目标阶段:事件到达目标元素本身

(3)冒泡阶段:从目标元素向外传播回 window 对象

三、事件捕获(Event Capturing)

事件捕获是从外向内的传播过程,现代浏览器支持通过 addEventListener 的第三个参数来监听捕获阶段的事件。

document.getElementById('outer').addEventListener('click',() => console.log('Outer - Capture'),true // true 表示在捕获阶段触发
);

四、事件冒泡(Event Bubbling)

事件冒泡是从内向外的传播过程,这是默认的事件传播方式。

document.getElementById('inner').addEventListener('click',() => console.log('Inner - Bubble')// 第三个参数默认是 false,表示在冒泡阶段触发
);

五、完整示例

<div id="outer"><div id="middle"><div id="inner">Click me</div></div>
</div><script>
// 捕获阶段
document.getElementById('outer').addEventListener('click', () => console.log('Outer - Capture'), true);
document.getElementById('middle').addEventListener('click', () => console.log('Middle - Capture'), true);
document.getElementById('inner').addEventListener('click', () => console.log('Inner - Capture'), true);// 冒泡阶段
document.getElementById('outer').addEventListener('click', () => console.log('Outer - Bubble'));
document.getElementById('middle').addEventListener('click', () => console.log('Middle - Bubble'));
document.getElementById('inner').addEventListener('click', () => console.log('Inner - Bubble'));
</script>

点击 inner 元素时的输出顺序:Outer - Capture

Middle - Capture
Inner - Capture
Inner - Bubble
Middle - Bubble
Outer - Bubble

六、阻止事件传播

使用 event.stopPropagation() 可以阻止事件继续传播:

document.getElementById('middle').addEventListener('click', (e) => {console.log('Middle - Bubble');e.stopPropagation(); // 阻止事件继续冒泡
});

七、实际应用场景

(1)事件委托:利用冒泡特性,将事件监听器添加到父元素而非每个子元素

(2)事件节流与防抖:在捕获或冒泡阶段处理高频触发事件

(3)组件封装:在框架中利用事件流实现父子组件通信

八、注意事项

(1)IE8 及以下只支持事件冒泡

(2)某些事件(如 focus、blur)不支持冒泡

(3)使用 event.target 获取实际触发事件的元素

http://www.dtcms.com/a/457436.html

相关文章:

  • 数据湖架构
  • 对网站有效的优化软件长沙网站托管
  • 网站用户 分析宁波网站建设联系电话查询
  • Docker 镜像结构
  • RAG 让你的 AI 更聪明
  • 软测面经(二)
  • 微信小程序入门学习教程,从入门到精通,微信小程序核心组件详解与使用方法(12)
  • redis的集群中的简单问题
  • 托福阅读+听力【2】
  • 技术与情感交织的一生 (十四)
  • Linux 高手进阶:Vim 核心模式与分屏操作详解
  • 计组2.2.0——逻辑门电路,多路选择器,三态门
  • intellij 网站开发公司网页制作哪家比较好
  • 基于GD32的RT-Thread移植(邪修版)
  • 如何让百度口碑收录自己的网站怎么用vs2015做网站
  • 2017优秀网站设计案例个人域名备案有什么风险
  • [论文阅读] AI+软件工程(需求工程)| 告别需求混乱!AI-native时代,需求工程的5大痛点与3大破局方向
  • WPF基本布局容器与控件
  • 临时需电子印章?无需下载注册生成高清印章
  • Qt基础之五十:Qt设置样式的几种方式
  • 理解Roo Code的速率限制与成本优化
  • 农村建设集团有限公司网站重庆南川网站制作价格
  • 爬虫调试技巧:常用工具与日志分析,快速定位问题
  • 反向代理和负载均衡
  • 水果网站设计论文网页传奇游戏中心
  • 兰州网站建设lst0931wordpress调用函数大全
  • JavaScript核心构成与基础语法详解1
  • Redission分布式锁、WatchDog续约、布隆过滤器
  • 《jQuery 捕获》
  • 【开题答辩全过程】以 阿歹果园养鸡场管理系统为例,包含答辩的问题和答案