当前位置: 首页 > news >正文

深入理解JavaScript中的事件冒泡与事件捕获

在JavaScript中,事件是交互式网页开发中的关键概念之一。了解事件冒泡和事件捕获是成为一名优秀的前端开发者所必需的技能之一。本文将深入探讨这两个概念,解释它们是如何工作的,以及如何在实际应用中使用它们来处理事件。

 

一.什么是事件冒泡和事件捕获?

事件冒泡和事件捕获是一种事件传播的机制,用于确定在DOM(文档对象模型)中的哪个元素上触发事件以及事件触发的顺序。

事件冒泡(Event Bubbling):在事件冒泡中,事件从最具体的元素开始,然后逐级向上传播到最不具体的元素。也就是说,当在一个子元素上触发事件时,该事件将首先在子元素上触发,然后在父元素、祖父元素,以此类推,一直传播到文档的根元素。

事件捕获(Event Capturing):相比之下,事件捕获从文档的根元素开始,然后逐级向下传播到最具体的元素。也就是说,事件在捕获阶段从根元素开始向下传播,直到达到触发事件的目标元素。

 

二.事件流程示例

为了更好地理解事件冒泡和事件捕获,我们来看一个简单的HTML结构和JavaScript示例。

<!DOCTYPE html>
<html><head><title>事件冒泡与事件捕获</title></head><body><div id="outer"><div id="middle"><div id="inner">点击我</div></div></div><script>const outer = document.getElementById("outer");const middle = document.getElementById("middle");const inner = document.getElementById("inner");outer.addEventListener("click", () => {console.log("外部元素点击事件 - 冒泡阶段");}, false);middle.addEventListener("click", () => {console.log("中间元素点击事件 - 冒泡阶段");}, false);inner.addEventListener("click", () => {console.log("内部元素点击事件 - 冒泡阶段");}, false);outer.addEventListener("click", () => {console.log("外部元素点击事件 - 捕获阶段");}, true);middle.addEventListener("click", () => {console.log("中间元素点击事件 - 捕获阶段");}, true);inner.addEventListener("click", () => {console.log("内部元素点击事件 - 捕获阶段");}, true);</script></body>
</html>

输出:

 

在这个示例中,我们有一个包含三个嵌套的<div>元素,分别是outermiddleinner。我们分别在它们上面注册了点击事件的监听器,并通过第三个参数(useCapture)指定了事件捕获阶段(true)和事件冒泡阶段(false)。

 

三.事件流程解释

  • 点击inner元素时,首先触发事件捕获阶段,从根元素html开始向下传播。在捕获阶段,依次触发了outermiddleinner上的捕获事件监听器。

  • 接着,事件进入冒泡阶段,从触发事件的目标元素inner开始向上冒泡,依次触发了innermiddleouter上的冒泡事件监听器。

因此,点击inner元素时,事件的流程是从捕获阶段到冒泡阶段,依次经过所有元素。 

 

四.如何使用事件冒泡和事件捕获

了解事件冒泡和事件捕获的工作原理后,你可以灵活运用它们来处理事件。以下是一些示例用途:

  1. 事件委托(Event Delegation):通过在父元素上监听事件,可以减少事件监听器的数量,提高性能。在事件处理程序中,你可以根据事件的target属性来确定是哪个子元素触发了事件。

  2. 控制事件流:你可以选择在事件捕获阶段或事件冒泡阶段处理事件,具体取决于你的需求。例如,如果你希望在事件到达目标元素之前拦截并处理它,可以使用事件捕获。

  3. 停止事件传播:使用event.stopPropagation()可以停止事件的进一步传播,阻止其继续冒泡或捕获。

 

五.总结

事件冒泡和事件捕获是JavaScript中重要的事件传播机制,允许你更精细地控制事件的处理流程。通过深入理解这两种机制,你可以更好地应对复杂的DOM结构和交互式需求,提高你的前端开发技能。

相关文章:

深入理解JavaScript中的事件冒泡与事件捕获

在JavaScript中&#xff0c;事件是交互式网页开发中的关键概念之一。了解事件冒泡和事件捕获是成为一名优秀的前端开发者所必需的技能之一。本文将深入探讨这两个概念&#xff0c;解释它们是如何工作的&#xff0c;以及如何在实际应用中使用它们来处理事件。 一.什么是事件冒泡…...

纯css html 真实水滴效果

惯例,不多说直接上图 秉承着开源精神,我们将这段代码无私地分享给大家&#xff0c;因为我们深信&#xff0c;信息的共享和互相学习是推动科技进步的关键。我们鼓励大家在使用这段代码的同时&#xff0c;也能够将其中的原理、思想和经验分享给更多的人。 这份代码是我们团队用心…...

HBASE集群主节点迁移割接手动操作步骤

HBASE集群主节点迁移割接手动操作步骤 HBASE集群主节点指的是包含zk、nn、HM和rm服务的节点&#xff0c;一般这类服务都是一起复用在同一批节点上&#xff0c;我把这一类节点统称为HBASE集群主节点。 本文中使用了rsync、pssh等工具&#xff0c;这类是开源的&#xff0c;自己…...

TRB爆仓分析,套利分析,行情判断!

毫无疑问昨日TRB又成为涨幅榜的明星&#xff0c;总结下来&#xff0c;多军赚麻&#xff0c;空头爆仓&#xff0c;套利爽歪歪&#xff01; 先说风险最小的套利情况&#xff0c;这里两种套利都能实现收益。 现货与永续合约的资金费率套利年化资金费率达到惊人的3285%——DeFi的…...

LVGL - RV1109 LVGL UI刷新效率优化-02

说明 前面好早写过一个文章&#xff0c;说明如何把LVGL移到RV1109上的操作&#xff0c;使用DRM方式&#xff01;但出现刷新效率不高的问题&#xff01; 因为一直没有真正的应用在产品中&#xff0c;所以也就放下了&#xff01; 最近开发上需要考虑低成本&#xff0c;低内存的…...

5、布局管理器

5、布局管理器 一、流式布局 package com.dryant.lesson1;import java.awt.*;public class TestFlowLayout {public static void main(String[] args) {Frame frame new Frame();Button button1 new Button("bt1");Button button2 new Button("bt2");…...

What is a UDP Flood Attack?

用户数据报协议 &#xff08;UDP&#xff09; 是计算机网络中使用的无连接、不可靠的协议。它在互联网协议 &#xff08;IP&#xff09; 的传输层上运行&#xff0c;并提供跨网络的快速、高效的数据传输。与TCP&#xff08;其更可靠的对应物&#xff09;不同&#xff0c;UDP不提…...

多核 ARM Server 性能调优

概述 thinkforce ARM Server是多核心ARM服务器&#xff0c;硬件环境资源如下&#xff1a; CPU信息如下: yuxunyuxun:/$ lscpu Architecture: aarch64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian …...

oracle执行计划中,同一条语句块,在不同情况下执行计划不一样问题。子查询,union 导致索引失效。

场景&#xff1a; 需要获取部分数据集(视图)的业务时间最大值&#xff0c;希望只通过一条语句获取多个的最大值。 则使用select (视图1业务时间最大值),(视图2业务时间最大值),(视图3业务时间最大值) from dual 程序执行过程中&#xff0c;发现语句执行较慢&#xff0c;则进行s…...

【新的小主机】向日葵远程控制ubuntu

向日葵远程控制ubuntu 一、简介二、问题及解决方法2.1 向日葵远程连接Ubuntu22主机黑屏&#xff1f;2.2 Ubuntu如何向日葵开机自启&#xff1f;2.3 无显示器情况下&#xff0c;windows远程桌面连接Ubuntu? 三、待续。。。 一、简介 系统&#xff1a;ubuntu22.04.3 目的&#…...

在Android studio高版本上使用低版本的Github项目库报错未能解析:Landroid/support/v4/app/FrageActivity;

我在我的项目中有一个导包: // 基础依赖包&#xff0c;必须要依赖 沉浸式狀態欄 implementation com.gyf.immersionbar:immersionbar:3.0.0 但是我的as版本比较高,我使用这个导包里面的方法会直接报错: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/suppor…...

自动混剪多段视频、合并音频、添加文案的技巧分享

在如今的社交媒体时代&#xff0c;视频的重要性越来越被人们所重视。许多人喜欢记录生活中的美好瞬间&#xff0c;并将其制作成视频分享给朋友和家人。然而&#xff0c;对于那些拍摄了大量视频的人来说&#xff0c;一个一个地进行剪辑和合并可能是一项令人头痛的任务。但是&…...

学习笔记——BSGS

众所周知&#xff0c;北上广深是中国非常一线的城市&#xff0c;北京是首都&#xff0c;地处…… 正片开始&#xff01; 一、BSGS基础算法 实现目标&#xff1a; A x ≡ B ( m o d P ) , ( gcd ⁡ ( P , A ) 1 ) A^x\equiv B(\mod P),(\gcd(P,A)1) Ax≡B(modP),(gcd(P,A)1)…...

【AI视野·今日NLP 自然语言处理论文速览 第四十期】Mon, 25 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 25 Sep 2023 Totally 46 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers ReConcile: Round-Table Conference Improves Reasoning via Consensus among Diverse LLMs Authors Justin C…...

Linux C/C++下收集指定域名的子域名信息(类似dnsmap实现)

我们知道dnsmap是一个工具&#xff0c;主要用于收集指定域名的子域名信息。它对于渗透测试人员在基础结构安全评估的信息收集和枚举阶段非常有用&#xff0c;可以帮助他们发现目标公司的IP网络地址段、域名等信息。 dnsmap的操作原理 dnsmap&#xff08;DNS Mapping&#xff…...

linux-定时任务

目录 一、crond命令 1、什么是计划任务 2、crond服务的概念 3、crontab 二、at命令 1、at任务的概念 三、邮件服务 1、概念 2、启动postfix 四、mailx命令 1、三个概念&#xff1a; 2、交互式发邮件 3、非交互式发邮件 四、cron定时任务实践 1、系统定时任务配置…...

在Spring Boot项目中使用Redisson

在Spring Boot项目中使用Redisson Redisson简介 Redisson官网仓库 Redisson中文文档 Redission是一个基于Java的分布式缓存和分布式任务调度框架&#xff0c;用于处理分布式系统中的缓存和任务队列。它是一个开源项目&#xff0c;旨在简化分布式系统的开发和管理。 以下是…...

JavaScript 函数柯里化

&#x1f3b6;什么是柯里化 柯里化&#xff08;Currying&#xff09;是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数&#xff0c;并且返回接受余下的参数且返回结果的新函数的技术。 &#x1f3a1;简单的函数柯里化的实现 // ------------- 原函数…...

springboot实现ACL+RBAC权限体系

本文基于web系统的权限控制非常重要的前提下&#xff0c;从ALC和RBAC权限控制两个方面&#xff0c;介绍如何在springboot项目中实现一个完整的权限体系。 源码下载 &#xff1a;https://gitee.com/skyblue0678/springboot-demo 序章 一个后台管理系统&#xff0c;基本都有一套…...

C++20协程示例

C20协程示例 认识协程 在C中&#xff0c;协程就是一个可以暂停和恢复的函数。 包含co_wait、co_yield、co_return关键字的都可以叫协程。 看一个例子&#xff1a; MyCoroGenerator<int> testFunc(int n) {std::cout << "Begin testFunc" << s…...

AI编程助手技能化:开源agent-skills项目实战指南

1. 项目概述&#xff1a;为AI编程助手注入“专业技能包” 如果你和我一样&#xff0c;日常重度依赖 Claude Code、Cursor 这类 AI 编程助手来辅助开发和研究&#xff0c;那你肯定遇到过这样的场景&#xff1a;想让 AI 帮你深入理解一篇复杂的数学论文&#xff0c;或者验证一个…...

SlowFast复现避坑大全:从ava.json配置到pkl模型下载,解决‘libopenh264.so.5’等常见报错

SlowFast实战排错指南&#xff1a;关键配置与依赖问题深度解析 当你在深夜的显示器前第三次看到libopenh264.so.5报错时&#xff0c;咖啡杯已经见底。这不是一篇按部就班的安装教程&#xff0c;而是一份来自实战前线的"生存手册"——我们将直击SlowFast复现过程中最致…...

月薪3000和年薪百万,差距凭什么这么大?行业“薪资金字塔”大揭秘!

文章揭示了具身智能行业内部的巨大薪资差距&#xff0c;分为金字塔底层&#xff08;机器人训练师&#xff09;、中层&#xff08;AI应用/AI Agent开发&#xff09;和顶层&#xff08;核心算法人才&#xff09;三个层次。底层薪资约为19.5万元&#xff0c;主要依靠执行力和耐心&…...

数学竞赛资源合集

《高中数学•竞赛教程》四册(第三版) 文件大小: 1.1GB内容特色: 四册高清笔记真题拆解&#xff0c;省队教练亲授适用人群: 想一年冲省一的高一高二竞赛党核心价值: 刷完这套&#xff0c;一试二试不再丢分下载链接: https://pan.quark.cn/s/7a64da5c8d8d 浙大优学-高中数学竞赛…...

XYBotV2:开发者如何快速构建可扩展的智能对话机器人框架

1. 项目概述&#xff1a;一个面向开发者的智能对话机器人框架最近在GitHub上看到一个挺有意思的项目&#xff0c;叫XYBotV2。乍一看标题&#xff0c;可能很多人会以为这又是一个普通的聊天机器人&#xff0c;但如果你点进去仔细研究一下&#xff0c;就会发现它其实是一个为开发…...

中国词元与世界AI元语:模力方舟和口袋龙虾的协同进化

在AI产业从技术突破转向生态竞争的今天&#xff0c;一个核心命题日益凸显&#xff1a;如何让顶尖的AI能力跨越技术鸿沟&#xff0c;真正触达每一个开发者与终端用户&#xff1f;开源中国以“模力方舟”与“口袋龙虾”为双核驱动&#xff0c;构建了一条从底层资源聚合到上层应用…...

AI代理如何通过MCP协议实现DeFi自动化操作与安全交互

1. 项目概述&#xff1a;当DeFi遇上AI代理&#xff0c;一场链上金融的自动化革命如果你和我一样&#xff0c;在DeFi&#xff08;去中心化金融&#xff09;世界里摸爬滚打了好几年&#xff0c;从早期的流动性挖矿到后来的各种收益聚合器&#xff0c;一个深刻的体会是&#xff1a…...

NeumAI向量检索平台:构建生产级RAG应用的端到端Pipeline实践

1. 项目概述&#xff1a;从“Neum”到“AI”&#xff0c;一个向量检索系统的诞生最近在折腾RAG&#xff08;检索增强生成&#xff09;应用&#xff0c;发现向量检索这块的性能和成本&#xff0c;简直是决定项目成败的“命门”。自己从零开始搭一套&#xff0c;从数据清洗、向量…...

好用的四川企业用工风险咨询生产厂家

行业痛点分析在四川企业用工风险咨询领域&#xff0c;企业面临诸多技术挑战。首先&#xff0c;许多企业虽意识到用工风险的存在&#xff0c;但却不清楚风险具体所在。测试显示&#xff0c;超过七成企业未系统排查过自身用工风险&#xff0c;社保未足额缴纳、合同存在漏洞、规章…...

2026一氧化碳监测仪选型避坑指南:康高特等厂家深度对比评测

引言一氧化碳&#xff08;CO&#xff09;&#xff0c;这种无色、无味、无刺激性的气体&#xff0c;因其与血红蛋白的极高亲和力&#xff0c;在工业生产、公共安全及环境监测领域构成了严峻的“隐形威胁”。随着全球工业化进程的加速和安全生产标准的日益提升&#xff0c;对一氧…...