Spirit带你彻底了解事件捕获和冒泡机制
Dom标准事件模型
在Dom标准事件模型中,事件是先进行捕获,达到目标阶段时,在进行冒泡的
捕获阶段==>目标阶段==>冒泡阶段
目标元素和非目标元素
在介绍事件捕获和事件冒泡前
我们先要了解一下目标元素和非目标元素是什么意思
- 目标元素:它是我们当前触发事件的元素
- 非目标元素:它是在捕获阶段或着冒泡阶段中因为绑定了同类型的事件而触发的元素
- 每个Dom元素可以绑定多个事件,前提是使用
addEvenetListener
去添加事件,即使是相同的事件,也可以重复绑定.
事件捕获
从页面的根元素开始 一层一层的往下寻找
可以看下我在最上面画的那张图
事件冒泡
从目标元素一直往上寻找
可以看下我在最上面的那张图
addEventListener
addEventListener
可以传入第三个参数useCapture,默认是false其实还有一个option参数可以传递,但是我没细看,因为目前我看了,我也不知道应用场景,所以打算有需求了,后面在看
- 当
useCapture
参数会false时,默认是捕获阶段 不会触发事件监听,会在冒泡阶段触发事件监听 - 当
useCapture
参数会true时,事件监听时从捕获阶段开始,但是冒泡阶段不会触发事件监听
举例说明
现在我们来分析一道题, 布局代码都在下面了
HTML代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
.c {
width: 200px;
height: 200px;
background-color: orange;
}
</style>
<body>
<div class="a">
a
<div class="b">
b
<div class="c">c</div>
</div>
</div>
</body>
<script src="./script.js"></script>
</html>
JS代码
const a = document.querySelector(".a");
const b = document.querySelector(".b");
const c = document.querySelector(".c");
a.addEventListener("mousedown", () => {
alert("弹出a");
}, false)
b.addEventListener("mousedown", (e) => {
alert("弹出b");
}, true)
c.addEventListener("mousedown", (e) => {
console.log(e)
alert("mousedown2");
}, true)
c.addEventListener("mousedown", (e) => {
alert("mousedown1");
}, false)
c.addEventListener("mousedown", (e) => {
console.log(e)
alert("mousedown3");
}, false)
c.addEventListener("mousedown", (e) => {
console.log(e)
alert("mousedown4");
}, true)
分析
从HTML来看,嵌套层级是
a>b>c
现在来看JS代码
a,b,c都绑定了
mousedown
事件,我们仔细看下,这个的执行顺序是怎么样的?我可以在给你们分析一下
对于同一个元素,绑定多个事件,无论是一样的事件,还是不一样的事件,只要是触发了对应事件的监听器,那么它都会执行
那么同一个事件的执行顺序是怎么样的呢?
同一个事件的执行顺序是根据定义的顺序来执行的,前提是useCapture保持一致
当我们点击目标元素时,我们是处于目标阶段的,而不是处于冒泡阶段或者捕获阶段,这一句话请牢牢记住
处于目标阶段时,当useCapture有true,又有false的阶段时
这个时候 我们可以理解为目标元素其实是形成了一个类似于Dom事件模型的东西.
在这个模型内,也有捕获阶段和冒泡阶段.
所以如果有true的话,会先执行捕获阶段,按照定义顺序
然后执行fasle阶段,也就是冒泡阶段,按照事件的定义顺序所以在目标阶段执行的时候,这么多事件的执行顺序就是
mousedown2
mousedown4
mousedown1
mousedown3
那么我们现在可以看下这个整个HTML页面,这个执行顺序是什么样的呢?
其实和目标阶段的执行是一样的
非目标元素的useCapture
为true时,捕获阶段会先执行事件监听
非目标元素的useCapture
为false时,会在捕获阶段和目标阶段执行完毕后,在冒泡阶段执行事件监听
举个例子,如果我在b
身上也绑定了多个相同类型的事件,在有true
,有false
的情况下,它会先执行true
的,false
的不会等true
执行完毕后就立马执行,而是等待目标阶段执行完毕后,才继续执行
大家如果不信的,可以自己去尝试一下所以整体的执行顺序是
b
mousedown2
mousedown4
mousedown1
mousedown3
a
图解
我怕大家还是不明白我说的是什么意思
所以我画了这张图,把这个过程给大家详细介绍一下
Spirit带你彻底了解事件捕获和冒泡机制的更多相关文章
- JavaScript 事件(捕获和冒泡 兼容性写法)
事件 浏览器客户端上客户触发的行为都称为事件 所有的事件都是天生自带的 不需要人为绑定 只需要我们去触发通过obj.事件名=function(){} 我们给元素的事件绑定了一个方法 事件名:on ...
- dom事件不求甚解,色解事件捕获和冒泡
以前对事件只会用jq的bind绑定一下,脑海里留着书中的事件循环,一直认为事件就是这儿循环的,最近看园子里的文章,对事件的了解更模糊了 所以我做了个小实验,总结一下看的这些零零碎碎的文章,如果总结错了 ...
- javascript事件捕获与冒泡
对“捕获”和“冒泡”这两个概念,我想我们对冒泡更熟悉一些,因为在我们使用的所有浏览器中,都支持事件冒泡,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样.而在像firefox,chrom ...
- js中addEventListener第三个参数涉及到的事件捕获与冒泡
js中,我们可以给一个dom对象添加监听事件,函数就是 addEventListener("click",function(){},true); 很容易理解,第一个参数是事件类型, ...
- JS Event事件流(冒泡机制、捕获机制、事件绑定)
1.事件流 事件流:从页面中接收事件的顺序.也就是说当一个事件产生时,这个事件的传播过程,就是事件流. IE的事件流 IE中的事件流叫事件冒泡:事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播 ...
- js事件捕获和冒泡解析
<div id="box"> <div id="box2"> <p id="test">test< ...
- JS中的事件、事件冒泡和事件捕获、事件委托
https://www.cnblogs.com/diver-blogs/p/5649270.html https://www.cnblogs.com/Chen-XiaoJun/p/6210987.ht ...
- JavaScript高级程序设计笔记 事件冒泡和事件捕获
1.事件冒泡 要理解事件冒泡,就得先知道事件流.事件流描述的是从页面接收事件的顺序,比如如下的代码: <body> <div> click me! </div> & ...
- js之事件冒泡和事件捕获介绍
链接:http://www.jb51.net/article/42492.htm (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. (2)捕获型事件 ...
随机推荐
- 面试官:你的App卡顿过吗?你是如何监控的?
一.故事开始 面试官:平时开发中有遇到卡顿问题吗?你一般是如何监控的? 来面试的小伙:额...没有遇到过卡顿问题,我平时写的代码质量比较高,不会出现卡顿. 面试官:... 这回答似乎没啥问题,但是如果 ...
- IP地址,InetAddress类的使用
IP地址 IP地址:InetAddress(没有构造器,通过静态方法返回) java.net包下 唯一定位一台网络上的计算机 127.0.0.1:本机localhost ip地址的分类 IPV4/IP ...
- SQL injection:Summary ,Overview and Classification
What is SQL injection (SQLi)? SQL注入是一种web安全漏洞,让攻击者干扰应用程序对其数据库的查询. 它通常使得攻击者查看他们通常无法检索的数据. 这可能包括属于其他用户 ...
- CVE-2021-21972 vSphere Client RCE复现,附POC & EXP
漏洞简介 vSphere 是 VMware 推出的虚拟化平台套件,包含 ESXi.vCenter Server 等一系列的软件.其中 vCenter Server 为 ESXi 的控制中心,可从单一控 ...
- Oracle 数据库的导入与导出
1.导入 打开cmd,用管理员登录:sqlplussys as sysdba密码不用输: 创建表空间:create tablespace tablespaceName datafile 'E:\tab ...
- .NET第三方补丁工具(Visual Patch)常用手册
SetupFactory简介 这是Indigo Rose(蓝玫瑰)公司开发的一套打包-补丁解决方案的补丁工具,相比Setup Factory,他的知名度似乎不太高,网上也很少找到相关资料,但是真的很简 ...
- 题解 Smooth
传送门 咕了蚯蚓这题+前一天被蚊子折腾了半宿没睡=全场几乎就我这题分最低-- 发现这里光滑数是不断乘出来的--记得这是一个很经典的套路,然而当时我咕了 求一个每个值都是 \(\{p_i\}\) 中至少 ...
- Docker运行中文版GitLab
docker-compose.yml version: '3' services: web: image: 'twang2218/gitlab-ce-zh:10.5' restart: always ...
- COM笔记-包容与聚合
COM不支持实现继承的原因在于这种继承方式将使得一个对象的实现同另外一个对象的实现紧紧地关联起来.在这种情况下,当基类的实现被修改后,派生类将无法正常运行而必须被修改.这就是为什么一些用C++编写大型 ...
- element ui loading加载开启与关闭
参考:https://blog.csdn.net/qq_41877107/article/details/87690555 Vue项目引入element-ui,之后,将以下代码写入 mounted() ...