说说 JavaScript 中的冒泡与捕获过程
发布日期:2021-06-29 21:04:28
浏览次数:2
分类:技术文章
本文共 2750 字,大约阅读时间需要 9 分钟。
W3C 规范中定义了3个事件阶段,依次是捕获阶段 、 目标阶段 、 冒泡阶段。先捕获,后冒泡,捕获从上到下,就像石沉大海;而冒泡从下到上就像气泡冒出水面。
先看个示例:
html 页面:
冒泡与捕获
美杉 | 禄铭 |
彦芸 | 阳骞 |
js :
/* * 冒泡与捕获 * @author Deniro Lee */let html = document.documentElement;let body = document.body;let table = body.querySelector('table');let tbody = body.querySelector('tbody');let secondTr = body.querySelector('#secondTr');let firstTd = body.querySelector('#firstTd');/** * 冒泡回调 * @param event */function bubbleCallback(event) { let target = event.currentTarget; console.log('bubble -> ' + target.tagName);}/** * 捕获回调 * @param event */function captureCallback(event) { let target = event.currentTarget; console.log('capture -> ' + target.tagName);}html.addEventListener('click', captureCallback, true);body.addEventListener('click', captureCallback, true);table.addEventListener('click', captureCallback, true);tbody.addEventListener('click', captureCallback, true);secondTr.addEventListener('click', captureCallback, true);firstTd.addEventListener('click', captureCallback, true);html.addEventListener('click', bubbleCallback, false);body.addEventListener('click', bubbleCallback, false);table.addEventListener('click', bubbleCallback, false);tbody.addEventListener('click', bubbleCallback, false);secondTr.addEventListener('click', bubbleCallback, false);firstTd.addEventListener('click', bubbleCallback, false);
在浏览器中运行以上页面,点击“彦芸”后,在 Console 中会看到冒泡与捕获的过程运行结果:
点击事件对象会按照图 1 的传播路径依次完成捕获、目标与冒泡阶段。如果某个阶段不支持或事件对象的传播被终止,那么该阶段就会被跳过。
代码中使用了addEventListener() 方法来跟踪捕获与冒泡阶段事件。该方法的语法为:
element.addEventListener(event, function, useCapture)
参数 | 描述 |
---|---|
event | 必须。字符串,指定事件名。注意: 不要使用 “on” 前缀。 例如,使用 “click” ,而不是使用 “onclick”。 |
function | 必须。指定要事件触发时执行的函数。 当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, “click” 事件属于 MouseEvent(鼠标事件) 对象。 |
useCapture | 可选。布尔值,指定事件是否在捕获或冒泡阶段执行。可能值: true - 事件句柄会在捕获阶段执行; false- 默认值,事件句柄会在冒泡阶段执行。 |
之前定义的脚本,我们使用 addEventListener() 方法先绑定捕获方法,后绑定冒泡方法;如果我们交换下顺序,先绑定冒泡然后再捕获会怎样?
html.addEventListener('click', bubbleCallback, false);body.addEventListener('click', bubbleCallback, false);table.addEventListener('click', bubbleCallback, false);tbody.addEventListener('click', bubbleCallback, false);secondTr.addEventListener('click', bubbleCallback, false);firstTd.addEventListener('click', bubbleCallback, false);html.addEventListener('click', captureCallback, true);body.addEventListener('click', captureCallback, true);table.addEventListener('click', captureCallback, true);tbody.addEventListener('click', captureCallback, true);secondTr.addEventListener('click', captureCallback, true);firstTd.addEventListener('click', captureCallback, true);
运行结果:
可以发现目标元素的冒泡事件先于捕获事件执行,其它元素顺序不变。也就是说,绑定顺序只影响到目标元素的事件发生顺序。
转载地址:https://deniro.blog.csdn.net/article/details/106456740 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月20日 10时11分00秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
嵌入式Linux系统移植-使用crosstool创建自己的交叉编译器
2019-04-30
编译binutil包
2019-04-30
使用Qt作窗口截屏
2019-04-30
grep与命令混合的用法
2019-04-30
Shell编程基础
2019-04-30
linux telnet命令参数及用法详解--telnet连接远程终端命令
2019-04-30
怎样查看rpm安装包的安装路径
2019-04-30
RedHat Linux下FTP服务配置
2019-04-30
shell检查网络出现异常、僵尸进程、内存过低后机器自动重启
2019-04-30
利用shell脚本来监控linux系统的内存
2019-04-30
常用awk命令
2019-04-30
Qt使用一张图片上的众多icon作为控件图标
2019-04-30
QT拖拽功能简介
2019-04-30
Qt拖放
2019-04-30
Qt图片拖放
2019-04-30
android库模块直接依赖时不能重复嵌套依赖
2019-04-30
关于SDK回调Qt函数的问题
2019-04-30
查询linux系统中空闲内存/内存使用状态查看/剩余内存查看
2019-04-30
Linux下屏保设置
2019-04-30
使用开源软件OpenIPMI来监控服务器温度
2019-04-30