当前位置:网站首页>关于事件捕获和事件冒泡的顺序,以及如何处理事件冒泡带来的影响
关于事件捕获和事件冒泡的顺序,以及如何处理事件冒泡带来的影响
2022-08-04 05:26:00 【strongest强】
以下为大家介绍关于事件捕获和事件冒泡的顺序
首先,给大家梳理以下关于addEventListener第三个值 true,或false的讲解
true填写,代表是事件捕获阶段
事件捕获,是从document->html-body->.....->点击的一个处理目标,例如此文中的<div id='l4'></div>。换句话说,就是从最大范围到你点击处理事件的最小范围 。
填写false或者不填,则代表是事件冒泡阶段
从点击处理事件到document为止,即正好与事件捕获阶段相反,从当前范围,到最大范围结束。
用下列一段代码为大家直观体现两者的差距
<style type="text/css">
#l1{
width: 500px;
height: 500px;
background-color: #6E8DFF;
}
#l2{
width: 300px;
height: 300px;
background-color: #e4fff4;
}
#l3{
width: 200px;
height: 200px;
background-color: #f3ffc4;
}
#l4{
width: 100px;
height: 100px;
background-color: #ffb189;
}
</style>
</head>
<body>
<div id='l1'>
<div id='l2'>
<div id='l3'>
<div id='l4'></div>
</div>
</div>
</div>
<script type="text/javascript">
var l1 = document.querySelector('#l1');
var l2 = document.querySelector('#l2');
var l3 = document.querySelector('#l3');
var l4 = document.querySelector('#l4');
l1.addEventListener('click', function() {
console.log("d1");
}, false)
l2.addEventListener('click', function() {
console.log("d2");
}, false)
l3.addEventListener('click', function() {
console.log("d3");
}, false)
l4.addEventListener('click', function() {
console.log("d4");
}, false)
l1.addEventListener('click', function() {
console.log("l1");
}, true)
l2.addEventListener('click', function() {
console.log("l2");
}, true)
l3.addEventListener('click', function() {
console.log("l3");
}, true)
l4.addEventListener('click', function() {
console.log("l4");
}, true)
</script>当点击最大的盒子时,会显示如下结果
l1 ,d1
点击第二大的盒子,会显示如下结果
l1, l2 ,d2 ,d1
点击第三大的盒子,会显示如下结果
l1, l2,l3 ,d3,d2 ,d1
点击最小的盒子,会显示如下结果
l1, l2,l3 ,l4 ,d4,d3,d2 ,d1
关于事件捕获和事件冒泡总结
根据上述输出结果可知,当处理同一个事件时,比如最大盒子,优先开始事件捕获,然后实行事件冒泡;而处理多个不同事件时,事件捕获从最大范围的盒子到点击处理事件的盒子,事件冒泡是从当前点击事件到最大范围的盒子。
怎么样阻止事件捕获和事件冒泡
常用stopPropagation()函数在停止事件继续发生;
展示以下实例
当我们在事件冒泡中,使用了 stopPropagation()函数
l3.addEventListener('click', function(e) {
e.stopPropagation();
console.log("d3");
}, false)未写代码,与最上头代码与上述相同
此时,不会在向更大的盒子(父级以及更大的辈分盒子)冒泡,输出结果是
l1, l2,l3 ,d3
同理可得,若在最小的盒子使用了stopPropagation()函数
输出结果只能是
l1, l2,l3 ,l4 ,d4
当我们在事件捕获中,使用了 stopPropagation()函数
l3.addEventListener('click', function(e) {
.stopPropagation();
console.log("l3");
}, true)此时,不会在向更小的盒子(孩子以及更小的辈分盒子)捕获,输出结果是
l1, l2,l3
就算点击最小的盒子(最小盒子没使用stopPropagation()函数,只在第三大的盒子使用了stopPropagation()函数),输出结果也只是
l1, l2,l3
而自身l4并没有输出
同理可得,若在最小的盒子使用了stopPropagation()函数
输出结果只能是
l1, l2,l3 ,l4
关于阻止事件捕获和事件冒泡总结
一,关于在事件捕获阶段使用stopPropagation()函数
就算我们写了后面的事件冒泡,也不会在发生事件冒泡现象,阻止了事件冒泡的过程
二,关于在事件冒泡阶段使用stopPropagation()函数
事件冒泡并不会阻止事件捕获阶段,只是会阻止自己向更上级的盒子发生冒泡
最后,感谢大家的查阅,新人一枚,热爱前端,相同各位分享前端收获,一起进步!
边栏推荐
猜你喜欢

腾讯136道高级岗面试题:多线程+算法+Redis+JVM

sql server如何得到本条记录与上一条记录的差异,即变动值
![Embedded system driver primary [3] - _IO model in character device driver foundation](/img/c7/21fc0651964a6a435e8ec5743b7662.png)
Embedded system driver primary [3] - _IO model in character device driver foundation

Unity Visual Effect Graph入门与实践

企业需要知道的5个 IAM 最佳实践

PHP实现异步执行程序

入坑软件测试的经验与建议

SLSA 框架与软件供应链安全防护

MySQL database (basic)

Summary of MySQL database interview questions (2022 latest version)
随机推荐
webrtc中的引用计框架
EntityComponentSystemSamples学习笔记
Sublime Text 3 2021.8.3 个人配置
TensorRTx-YOLOv5工程解读(一)
MySQL数据库面试题总结(2022最新版)
Embedded system driver primary [3] - _IO model in character device driver foundation
Plus版SBOM:流水线物料清单PBOM
[原创]STL容器map和unordered_map性能,创建,插入,随机访问速度对比!
TensorRT例程解读之语义分割demo
MySQL数据库(基础)
npm init [email protected] 构建项目报错SyntaxError: Unexpected token ‘.‘解决办法
心余力绌:企业面临的软件供应链安全困境
MySQL日志篇,MySQL日志之binlog日志,binlog日志详解
Grain Mall - Basics (Project Introduction & Project Construction)
4.3 Annotation-based declarative transactions and XML-based declarative transactions
8、自定义映射resultMap
OpenRefine中的正则表达式
MySql数据恢复方法个人总结
7. Execution of special SQL
LCP 17. 速算机器人