简单理解事件冒泡和事件捕获

2023-09-21 11:12:58

事件冒泡和事件捕获

DOM 事件流会依次经历3个阶段(事件也会依次触发):

(1)捕获阶段:事件从文档的根节点流向目标对象。

(2)当前目标阶段:在目标对象上被触发。

(3)冒泡阶段:从目标对象回溯到文档的根节点。

默认事件是冒泡阶段发生,如果设置了事件,那么会依次触发,内层事件执行完成,才会冒泡触发上一层。

1、事件冒泡

如图是3个div,蓝色最内层,绿色中间层,青色最外层,鼠标点击蓝色区域

请添加图片描述
结果如下:

请添加图片描述

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
.div1 {
	width: 600px;
	height: 600px;
	background-color: #00e9ea;
}
.div2{
	width: 400px;
	height: 400px;
	background-color: #00cc00;
}
.div3{
	width: 200px;
	height: 200px;
	background-color: #2d8cf0;
}
</style>
<body>
<div class='div1' onclick="handle1()">
	<div class='div2' onclick="handle2()">
		<div class='div3' onclick="handle3()"></div>
	</div>
</div>
</body>
</html>
<script>

function handle1(){
	console.log('我是最外层')
}
function handle2(){
	console.log('我是中间层')
}
function handle3(){
	console.log('我是最里层')
}
</script>

解释:点击一个位置(这个位置既属于最外层,又属于中间层,还属于最内层),那么事件发生顺序为:内层—>中间----->外层

2、事件捕获

示例1:将最外层div1绑定为捕获事件,那么触发顺序为:外层—>内层---->中间

请添加图片描述

代码:

<div class='div1'>
	<div class='div2' onclick="handle2()">
		<div class='div3' onclick="handle3()"></div>
	</div>
</div>
<script>
function handle1(){
	document.getElementsByClassName('div1')[0].addEventListener('click',()=>{
		console.log('我是最外层')
	},true)
}
handle1()

function handle2(){
	console.log('我是中间层')
}
function handle3(){
	console.log('我是最里层')
}
</script>

示例2:只将中间层div2绑定为捕获事件,那么触发顺序为:中间—>内层—>外层

请添加图片描述

示例3:只将最内层div3绑定为捕获事件,那么触发顺序为:内层—>中间----->外层

示例4:将最外层div1和中间层div2都绑定为捕获事件,那么触发顺序为:外层—>中间---->内层

1、在JavaScript中,事件默认是按照事件冒泡的方式传递的。
2、可以通过addEventListener方法的第三个参数来指定事件是按照事件捕获还是事件冒泡进行传递的。
3true:表示事件按照事件捕获方式传递。
4false:或不指定该参数,则表示事件按照事件冒泡方式传递。
注意:
1、vue中,元素使用@click绑定点击事件,默认冒泡,可以使用.capture修改为捕获阶段。
2、纯js中,使用onclick绑定点击事件,默认冒泡阶段触发,但是无法使用.capture,
只能使用addEventListener绑定事件,修改为捕获阶段。
更多推荐

Twin-Builder—系统级多物理域数字孪生平台

TwinBuilder是ANSYS公司系统仿真业务的核心产品,是一款跨学科多领域系统仿真软件和数字孪生平台。能够实现复杂系统的建模、仿真和验证,基于IIoT物联网平台对数字孪生体进行集成、部署与运行,在完成复杂系统功能、性能的验证和优化的同时,缩短开发时间和降低研发成本,并能够用于故障诊断,系统预测性维护,基于获得的运

苹果删除的照片如何恢复?无法拒绝的3个方法!

热爱摄影的人通常很热爱生活,照片是捕捉事物、人物、风景以及情绪的最佳方式。通过拍照,我们可以留住生活中路过的美好瞬间,所以照片对我们来说是非常有纪念意义的。但有时候可能会因为误操作而删除了一些非常重要的照片。那么苹果手机删除的照片如何恢复?小编教大家3招,帮助你找回那些珍贵的记忆。方法一:从“最近删除”中恢复删除的照片

.动态内存经典题分析(1)

题目:请问运⾏Test函数会有什么样的结果?voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(str);strcpy(str,"helloworld");printf(str);}intmain(){Te

浅谈应急照明系统在民用建筑的设计应用与产品选型

贾丽丽安科瑞电气股份有限公司上海嘉定201801【摘要】应急照明分为备用照明、安全照明及疏散照明。文章介绍了应急照明系统的设计、灯具选择、灯具布置、配电等要求。并结合实例进行疏散照明的计算,以指导应急照明系统的设计与应用。【关键词】照度;光通量;消防应急灯具;A型消防应急照明灯具;消防应急照明和疏散指示系统。引言现代建

【已解决】AttributeError: module ‘numpy‘ has no attribute ‘int‘.

文章目录问题详情问题原因解决方法专栏目录:神经网络精讲与实战AlexNetVGGNetGoogLeNetInceptionV2——V4ResNetDenseNetSE-ResNet问题详情AttributeError:module‘numpy’hasnoattribute‘int’.np.intwasadeprecat

策略模式实现方式之Map<K,Function>

策略模式实现方式之Map<K,Function>小概念场景我们有一个对象对象有一个行为该行为在不同场景中有不同的表现形式策略模式定义了一系列算法封装了每个算法这一系列的算法可互换代替代码实现定义一个对象行为表现形式枚举//定义一个对象行为表现形式枚举publicenumAdApplyTypeEnumimplements

Spark Dataset 快速上手

文章首发地址SparkDataset是Spark提供的一种强类型的数据抽象,它结合了RDD的强大功能和DataFrame的优化执行。下面是SparkDataset的JavaAPI的详细解释:创建Dataset:使用spark.createDataset()方法:通过调用spark对象的createDataset()方法

20-SpringCloudAlibaba-2

六分布式流量防护1认识分布式流量防护在分布式系统中,服务之间的相互调用会生成分布式流量。如何通过组件进行流量防护,并有效控制流量,是分布式系统的技术挑战之一。什么是服务雪崩假设我有一个微服务系统,这个系统内包含了ABCD四个微服务,这四个服务都是以集群模式构建的。雪崩问题:微服务之间相互调用,因为调用链中的一个服务故障

【Flink实战】玩转Flink里面核心的Sink Operator实战

🚀作者:“大数据小禅”🚀文章简介:玩转Flink里面核心的SinkOperator实战🚀欢迎小伙伴们点赞👍、收藏⭐、留言💬目录导航FlinkSinkOperator简介Flink核心知识SinkOperator速览Flink自定义的Sink连接Mysql存储商品订单案例实战FlinkSinkOperator简

uniapp:APP开发,后台保活

前言:在ios中,软件切换至后台、手机息屏,过了十来秒软件就会被系统挂起,APP内的任务就不能继续执行;在android中,默认情况下,软件在后台运行的时候,触发某些特定条件的情况下,会被杀掉进程。解决方案:以下方案均测试息屏后台运行两小时一、后台运行音频(无声音频)(一般)manifest.json配置:APP常用其

JavaScript:二进制数组【笔记】

二进制数组【ArrayBuffer对象、Type的Array视图和DataView视图】JavaScript操作二进制数据的一个接口。这些接口原本是和WebGL有关【WebGL是浏览器与显卡之间的通信接口】,为了满足JavaScript与显卡之间大量、实时数据交换,那么JavaScript和显卡之间的数据通信必须是二进

热文推荐