17-理解JavaScript中的事件捕获和事件冒泡

笔记+分享

在现代Web开发中,事件处理是一个至关重要的部分。JavaScript中的事件模型包括两个主要的阶段:事件捕获和事件冒泡。理解这两个概念有助于我们更好地控制事件的行为,进而编写更高效的代码。本文将详细介绍事件捕获和事件冒泡的概念、区别及其在实际开发中的应用。

事件捕获与事件冒泡的概念

事件捕获(Event Capturing)

事件捕获是事件传播的第一阶段。在这个阶段,事件从最外层的祖先元素开始,一层层向下传播到目标元素。捕获阶段的目标是寻找合适的事件处理程序,确保事件在抵达目标元素之前可以被处理。

事件冒泡(Event Bubbling)

事件冒泡是事件传播的第二阶段。在这个阶段,事件从目标元素开始,一层层向上传播到最外层的祖先元素。冒泡阶段的目标是允许更高层的元素有机会处理事件。

事件传播的具体过程

当一个事件触发时,它会经历三个阶段:

  1. 捕获阶段:事件从最外层祖先元素开始向目标元素传播。
  2. 目标阶段:事件到达目标元素。
  3. 冒泡阶段:事件从目标元素向最外层祖先元素传播。

这三个阶段共同构成了事件的完整传播路径。

如何在JavaScript中处理事件捕获和事件冒泡

在JavaScript中,我们可以通过addEventListener方法来为元素添加事件处理程序。这个方法可以接收三个参数:事件类型、事件处理函数和一个可选的布尔值参数,用于指定事件处理程序是在捕获阶段还是冒泡阶段执行。

element.addEventListener(type, listener, useCapture);
  • type:事件类型,如'click'
  • listener:事件处理函数。
  • useCapture:可选参数,默认值为false。如果为true,事件处理程序将在捕获阶段执行;如果为false,事件处理程序将在冒泡阶段执行。
示例代码

以下是一个简单的示例,演示事件捕获和事件冒泡的区别:

HTML结构:

<div id="outer">
    <div id="inner">
        Click me
    </div>
</div>

JavaScript代码:

const outer = document.getElementById('outer');
const inner = document.getElementById('inner');

outer.addEventListener('click', () => {
    console.log('Outer div clicked (capture)');
}, true);

inner.addEventListener('click', () => {
    console.log('Inner div clicked (capture)');
}, true);

inner.addEventListener('click', () => {
    console.log('Inner div clicked (bubble)');
}, false);

outer.addEventListener('click', () => {
    console.log('Outer div clicked (bubble)');
}, false);

在这个示例中,当点击inner元素时,控制台输出如下:

Outer div clicked (capture)
Inner div clicked (capture)
Inner div clicked (bubble)
Outer div clicked (bubble)

可以看到,事件先在捕获阶段触发outer的处理程序,然后触发inner的处理程序。接着进入冒泡阶段,先触发inner的处理程序,最后触发outer的处理程序。

阻止事件传播

有时我们可能希望在某个阶段停止事件的传播,可以使用以下方法:

  • event.stopPropagation():停止事件在捕获和冒泡阶段的传播。
  • event.stopImmediatePropagation():不仅停止事件的传播,还阻止当前元素上其他事件处理程序的执行。

示例代码:

inner.addEventListener('click', (event) => {
    console.log('Inner div clicked (bubble)');
    event.stopPropagation(); // 停止事件传播
}, false);

outer.addEventListener('click', () => {
    console.log('Outer div clicked (bubble)');
}, false);

点击inner元素时,控制台只输出:

Inner div clicked (bubble)

事件捕获和冒泡的应用场景

  • 事件捕获:适用于需要在事件到达目标元素之前进行处理的场景。例如,页面级的点击统计,可以在捕获阶段处理所有点击事件。
  • 事件冒泡:适用于事件委托。在父元素上监听子元素的事件,可以提高性能,减少内存消耗。

结论

理解事件捕获和事件冒泡是掌握JavaScript事件模型的关键。通过合理地使用这两种机制,我们可以更高效地处理事件,编写更具响应性的Web应用。在实际开发中,结合stopPropagationstopImmediatePropagation方法,可以进一步控制事件的传播,满足各种复杂的业务需求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917193.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每日刷题】Day156

【每日刷题】Day156 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1020. 飞地的数量 - 力扣(LeetCode) 2. 1765. 地图中的最高点 - 力扣(LeetCode) 3. 1162. 地图分…

J.U.C - 深入解读Condition条件变量原理源码

文章目录 Pre概述Condition 主要方法Condition案例Condition的源码解析1. 等待&#xff1a;condition. await2. 唤醒Condition. signal Condition总结 Pre J.U.C - 深入解析ReentrantLock原理&源码 概述 配合synchronized同步锁在同步代码块中调用加锁对象notify和wait方…

c++ 类和对象(中)

前言 我们看看下面的代码以及代码运行结果 代码1 我们可以看到在我们的类Data中的函数成员print中&#xff0c;我们并没有设置形参&#xff0c;在调用此函数时&#xff0c;也并没有多余传参&#xff0c;但是我们调用它时&#xff0c;却能准确打印出我们的_year、_month、_day…

python:用 sklearn 构建 K-Means 聚类模型

pip install scikit-learn 或者 直接用 Anaconda3 sklearn 提供了 preprocessing 数据预处理模块、cluster 聚类模型、manifold.TSNE 数据降维模块。 编写 test_sklearn_3.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 构建 K-Means 聚类模型 "&…

使用python编写工具:快速生成chrome插件相关文件结构

本文将详细分析一段用 wxPython 编写的 Python 应用程序代码。该程序允许用户创建一些特定文件并将它们保存在指定的文件夹中&#xff0c;同时也能够启动 Google Chrome 浏览器并打开扩展页面&#xff0c;自动执行一些操作。 C:\pythoncode\new\crxiterationtaburl.py 全部代码…

使用Web Components构建模块化Web应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 引言 Web Co…

谷歌浏览器的自动翻译功能如何开启

在当今全球化的网络环境中&#xff0c;能够流畅地浏览不同语言的网页是至关重要的。谷歌浏览器&#xff08;Google Chrome&#xff09;提供了一项强大的自动翻译功能&#xff0c;可以帮助用户轻松跨越语言障碍。本文将详细介绍如何开启和使用谷歌浏览器的自动翻译功能&#xff…

算法---解决“汉诺塔”问题

# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…

uniapp对接极光推送,实现消息推送功能

通过集成JG-JPush和JG-JCore插件&#xff0c;可以在应用中添加消息推送功能&#xff0c;向用户发送通知、消息等。这对于提升用户体验、增加用户粘性非常有帮助‌。 效果图&#xff1a; 一、登录极光官网 进入【服务中心】-【开发者平台】 创建应用&#xff1a;【概览】- 【创…

redis高性能键值数据库技术简介

什么是redis redis是远程字典服务&#xff08;Remote Dictionary Server &#xff09;的简写&#xff0c;是一个完全开源的高性能的Key-Value数据库&#xff0c;提供了丰富的数据结构如string、Hash、List、SetSortedset等等。数据是存在内存中的&#xff0c;同时Redis支持事务…

进程信号

目录 信号入门 1. 生活角度的信号 2. 技术应用角度的信号 3. 注意 4. 信号概念 5. 用kill -l命令可以察看系统定义的信号列表 6. 信号处理常见方式概览 产生信号 1. 通过终端按键产生信号 Core Dump 2. 调用系统函数向进程发信号 3. 由软件条件产生信号 4. 硬件异…

NotePad++中安装XML Tools插件

一、概述 作为开发人员&#xff0c;日常开发中大部的数据是标准的json格式&#xff0c;但是对于一些古老的应用&#xff0c;例如webservice接口&#xff0c;由于其响应结果是xml&#xff0c;那么我们拿到xml格式的数据后&#xff0c;常常会对其进行格式化&#xff0c;以便阅读。…

Java基础——多线程

1. 线程 是一个程序内部的一条执行流程程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序 2. 多线程 指从软硬件上实现的多条执行流程的技术&#xff08;多条线程由CPU负责调度执行&#xff09; 2.1. 如何创建多条线程 Java通过java.lang.Thread类的对象…

HarmonyOS ArkUI(基于ArkTS) 常用组件

一 Button 按钮 Button是按钮组件&#xff0c;通常用于响应用户的点击操作,可以加子组件 Button(我是button)Button(){Text(我是button)}type 按钮类型 Button有三种可选类型&#xff0c;分别为胶囊类型&#xff08;Capsule&#xff09;、圆形按钮&#xff08;Circle&#xf…

【FPGA开发】AXI-Stream总线协议解读

文章目录 AXI-Stream概述协议中一些定义字节定义流的定义 数据流类别字节流连续对齐流连续不对齐流稀疏流 协议的信号信号列表 文章为个人理解整理&#xff0c;如有错误&#xff0c;欢迎指正&#xff01; 参考文献 ARM官方手册 《IHI0051B》 AXI-Stream概述 协议中一些定义 A…

谷粒商城のMySQL集群分库分表

文章目录 前言一、MySQL的集群架构二、MySQL主从同步实践1.创建主节点实例2.创建从节点实例3.修改配置4.开始同步4.测试主从同步效果5.小结 三、MySQL分库分表1.配置sharding-proxy2.测试sharding-proxy3.小结 前言 本篇是谷粒商城集群部署篇&#xff0c;搭建MySQL集群以及分库…

计算机组成原理对于学习嵌入式开发的意义

计算机组成原理对于学习嵌入式开发的意义 前言 最近有位同学向我咨询&#xff0c;问学习嵌入式开发需不需要学习硬件&#xff1f;进而引申到了需不需要学习计算机组成原理呢&#xff1f; 正文 首先计算机组成原理是计算机科学与技术专业的一门核心基础课程&#xff0c;它深入…

npm list -g --depth=0(用来列出全局安装的所有 npm 软件包而不显示它们的依赖项)

您提供的命令 npm list -g --depth0 是在 Node Package Manager (npm) 的上下文中使用的&#xff0c;用来列出全局安装的所有 npm 软件包而不显示它们的依赖项。 这是它的运作方式&#xff1a; npm list -g --depth0-g: 指定列表应包括全局安装的软件包。--depth0: 限制树形结…

SpringBoot 2.2.10 无法执行Test单元测试

很早之前的项目今天clone现在&#xff0c;想执行一个业务订单的检查&#xff0c;该检查的代码放在test单元测试中&#xff0c;启动也是好好的&#xff0c;当点击对应的方法执行Test的时候就报错 tip&#xff1a;已添加spring-boot-test-starter 所以本身就引入了junit5的库 No…

多表查询综合归纳

目录 1. 多表关系 1.1 一对多&#xff08;多对一&#xff09; 1.2 多对多 1.3 一对一 2. 多表查询概述 2.1 熟悉表 2.2 笛卡尔积 2.3 消除笛卡尔积 2.4 多表查询分类 3. 内连接 3.1 隐式内连接 3.2 显式内连接 4. 外连接 4.1 左外连接 4.2 右外连接 5. 自连接 …