当前位置: 首页 > 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…...

【Verilog 教程】6.2Verilog任务

关键词&#xff1a;任务 任务与函数的区别 和函数一样&#xff0c;任务&#xff08;task&#xff09;可以用来描述共同的代码段&#xff0c;并在模块内任意位置被调用&#xff0c;让代码更加的直观易读。函数一般用于组合逻辑的各种转换和计算&#xff0c;而任务更像一个过程&a…...

Spring修炼之路(1)基础入门

一、简介 1.1Spring概述 Spring框架是一个轻量级的Java开发框架&#xff0c;它提供了一系列底层容器和基础设施&#xff0c;并可以和大量常用的开源框架无缝集成&#xff0c;可以说是开发Java EE应用程序的必备。Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&…...

GANs学习记录

GAN 基于GAN的研究识别相关不同背景目标图像 可以用Augmentation2021.3.15 基于GAN的研究 是通过GAN 进行图像重建&#xff0c;恢复细节&#xff0c;去模糊&#xff0c;提高图像质量&#xff0c;图像还原&#xff0c;去噪等等。 识别相关 一种基于生成对抗网络的训练样本扩充…...

Flink-CDC——MySQL、SqlSqlServer、Oracle、达梦等数据库开启日志方法

目录 1. 前言 2. 数据源安装与配置 2.1 MySQL 2.1.1 安装 2.1.2 CDC 配置 2.2 Postgresql 2.2.1 安装 2.2.2 CDC 配置 2.3 Oracle 2.3.1 安装 2.3.2 CDC 配置 2.4 SQLServer 2.4.1 安装 2.4.2 CDC 配置 2.5达梦 2.4.1安装 2.4.2CDC配置 3. 验证 3.1 Flink版…...

linux设置tomcat redis开机自启动

设置Tomcat自启动 1.修改 /etc/rc.d/rc.local 文件 [rootiowZ]# vim /etc/rc.d/rc.local在/etc/rc.d/rc.local文件最后加上&#xff1a; export JAVA_HOME/usr/local/jdk /usr/local/apache-tomcat-8.5.73/bin/startup.sh start退出vim并保存修改的文件。 说明&#xff1a;/u…...

跨域问题讨论

问题 跨域定义 当一个请求url的协议、域名、端口三者之间任意一个与当前页面地址不同即为跨域。 跨域的安全隐患&#xff08;CSRF攻击&#xff09; 也就是说&#xff0c;一旦允许跨域&#xff0c;意味着允许恶意网站随意攻击可信网站&#xff0c;带来安全风险。 这里面有一…...

ESP32设备通信-两个ESP32设备之间HTTP通信

两个ESP32设备之间HTTP通信 文章目录 两个ESP32设备之间HTTP通信1、应用介绍2、软件准备3、硬件准备4、代码实现4.1 ESP32服务器节点代码4.2 ESP32客户端节点代码在本文中,我们将介绍如何在没有任何物理路由器或互联网连接的情况下使用 Wi-Fi 在两个 ESP32 开发板之间执行无线…...

数据结构学习笔记——查找算法中的树形查找(平衡二叉树)

目录 一、平衡二叉树的定义二、平衡因子三、平衡二叉树的插入和构造&#xff08;一&#xff09;LL型旋转&#xff08;二&#xff09;LR型旋转&#xff08;三&#xff09;RR型旋转&#xff08;四&#xff09;RL型旋转 四、平衡二叉树的删除&#xff08;一&#xff09;叶子结点&a…...

P1830 轰炸III

题目背景 一个大小为 &#xfffd;&#xfffd;nm 的城市遭到了 &#xfffd;x 次轰炸&#xff0c;每次都炸了一个每条边都与边界平行的矩形。 题目描述 在轰炸后&#xff0c;有 &#xfffd;y 个关键点&#xff0c;指挥官想知道&#xff0c;它们有没有受到过轰炸&#xff0c;如…...

大语言模型LLM知多少?

你知道哪些流行的大语言模型?你都体验过哪写? GPT-4,Llamma2, T5, BERT 还是 BART? 1.GPT-4 1.1.GPT-4 模型介绍 GPT-4(Generative Pre-trained Transformer 4)是由OpenAI开发的一种大型语言模型。GPT-4是前作GPT系列模型的进一步改进,旨在提高语言理解和生成的能力,…...

福建省建设监理网官方网站/下载百度到桌面

前提 假设你了解过 SpringBoot 和 Kafka。 1、SpringBoot 如果对 SpringBoot 不了解的话&#xff0c;建议去看看 DD 大佬 和 纯洁的微笑 的系列博客。 2、Kafka Kafka 的话可以看看我前两天写的博客 &#xff1a; Kafka 安装及快速入门 学习的话自己开台虚拟机自己手动搭建环境…...

网站未建设的情况说明书/竞价托管

团队名为&#xff1a;wolf 组长为&#xff1a;朱国全 组员为&#xff1a;李昱&#xff0c;朱函&#xff0c;曹纪涛&#xff0c;干友恒&#xff0c;莫军林&#xff0c;叶雨&#xff0c;沈义杰&#xff0c;王浩 项目实现功能&#xff1a; 1.基本功能&#xff1a;抓取数据包 2.辅助…...

免费视频素材网站哪个最好/站长之家工具高清

WINDOWS 7 PRO X86 2015年9月增量补丁包&#xff0c;从Windowsupdate.log中提取的微软官方下载地址&#xff0c;大部分是2015年9月8日发布的&#xff0c;可以通过下载软件批量下载&#xff1a;http://download.windowsupdate.com/d/msdownload/update/software/secu/2015/08/wi…...

开源php企业网站/精准营销系统价值

1、内联接&#xff08;典型的联接运算&#xff0c;使用像 或 <> 之类的比较运算符&#xff09;。包括相等联接和自然联接。 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如&#xff0c;检索 students和courses表中学生标识号相同的所有行。 …...

wordpress 国内云/想做个网络推广

编者按Branch-and-Cut 是求解整数规划或混合整数规划问题最常用的算法之一。通常&#xff0c;把全部可行解空间反复地分割为越来越小的子集&#xff0c;称为分支&#xff1b;并且对每个子集内的解集计算一个目标下界&#xff08;对于最小值问题&#xff09;&#xff0c;称为定界…...

最容易做的门户网站/新网络营销

随着互联网的普及&#xff0c;即时通讯软件也渗透到了人们的日常生活和工作当中&#xff0c;而市面上的即时通讯软件现在有分为两种&#xff0c;一种是个人社交沟通软件&#xff0c;另外一种则是企业即时通讯。企业即时通讯软件是为了让企业内部方便沟通、管理及办公&#xff0…...