JavaScript学习记录 | DOM事件流 事件冒泡-事件捕获-事件委托

2023-09-18 03:34:47


DOM事件流

DOM事件流的三个阶段:捕获阶段 -> 目标阶段 -> 冒泡阶段
在这里插入图片描述


常见面试题

  • 事件冒泡和委托是什么?有什么使用场景?
  • 事件委托的优点和缺点
  • JS事件绑定的原理
  • 事件捕获和冒泡的过程
  • 什么时候用冒泡?什么时候用捕获?

事件冒泡与事件捕获

目的:解决页面中的事件流(事件发生顺序)的问题

  • 事件冒泡:事件从最深节点开始,然后逐步向上传播事件(从内到外)
  • 事件捕获:事件从DOM树的根节点开始,然后逐级向下捕获到最具体的元素(目标元素)(从外到内)

当事件处于目标阶段时,事件调用顺序决定于绑定事件的书写顺序

事件冒泡使用场景

常见的使用场景就是事件委托

通过事件委托,我们可以将事件处理程序绑定到父级元素,而不是直接绑定到每个子元素,从而减少了事件处理程序的数量,提高了性能和代码的可维护性。

事件捕获使用场景

事件捕获在实际开发中使用较少,但仍然有一些特定的使用场景:

  • 事件处理程序前置操作:由于事件处理程序执行顺序的原因,可以在事件到达目标元素之前拦截事件并进行处理
  • 高级事件处理:一些复杂的交互行为可能需要更细粒度的控制,而事件捕获提供了这种能力。例如,可以在事件捕获阶段使用stopPropagation方法停止事件的传播,以防止事件继续向下冒泡

事件冒泡和事件捕获区别

  1. 触发顺序事件捕获先于事件冒泡触发。在事件捕获阶段,事件从DOM树的根节点向下传播到目标元素;在事件冒泡阶段,事件从目标元素向上冒泡到根节点
  2. 事件处理程序执行顺序:在事件捕获阶段,父级元素的事件处理程序会先于子级元素的事件处理程序执行;在事件冒泡阶段,子级元素的事件处理程序会先于父级元素的事件处理程序执行
  3. 默认阶段:大多数事件处理程序默认情况下在事件冒泡阶段触发,因此它们通常在事件冒泡阶段被执行。但是,可以使用addEventListener的第三个参数来指定事件是在事件捕获阶段还是事件冒泡阶段处理

事件委托 - 利用事件冒泡机制

事件委托:事件委托是利用事件冒泡原理实现的,就是事件目标自身不处理事件,而是把处理任务委托给其父元素或者祖先元素,甚至根元素

事件委托应用场景

  • 为DOM中的很多元素绑定相同的事件
  • 为DOM中尚不存在的元素绑定事件

使用事件委托时,如果注册到目标元素上的其他事件处理程序使用了.stopPropagetion()阻止了事件传播,那么事件委托就会失效

支持事件委托的事件

  • 支持:click、mousedown、mouseup、keydown、keyup、keypress、change
  • 不支持:focus、blur

事件委托的优缺点

优点:

  • 减少事件注册,节省内存
  • 简化了dom节点更新时,相应事件的更新,比如:不用在新添加的 li 上绑定 click 事件,当删除某个 li 时,不用解绑上面的click事件

缺点:

  • 事件委托基于冒泡,对于不冒泡的事件不支持
  • 层级过多,冒泡过程中,可能会被某层阻止掉
  • 理论上委托会导致浏览器频繁调用处理函数,所以建议就近委托,比如在table上代理td,而不是在document上代理td
  • 把所有事件都用代理可能会出现事件误判
更多推荐

NSS [HNCTF 2022 WEEK2]easy_sql

NSS[HNCTF2022WEEK2]easy_sql这题考察了无列名注入,首先了解一下什么是无列名注入再开始做题吧。为什么会需要无列名注入?我们常用的SQL注入方法是通过information_schema这个默认数据库来实现,可是你有没有想过,如果过滤了该数据库那么我们就不能通过这个库来查出表名和列名。不过我们可以

UWB定位模块

UWB定位模组是华星智控自研的小尺寸高集成度模组,模组长宽厚为30.1513.955.62毫米,天线采用IPEX接口分体式设计,方便集成于您的产品中,产品采用本安设计,可以用于煤矿等井下场景,通信距离>100米,供电电压3.7V,支持标准锂电池供电。该模块定位精度可到10~30厘米,适合集成在各种需要高精度测距和定位产

可转债长期持有策略——收益与风险、利息收入、案例研究

可转债投资策略——长期持有策略一、收益与风险的权衡长期持有可转债是一种投资策略,旨在实现稳定的收益,并在投资期限内从可转债中获得利益。在采用这种策略时,投资者需要平衡可转债的收益和风险,以满足其财务目标。以下是关于长期持有策略中的收益与风险的权衡:收益:长期持有可转债可以提供稳定的利息收入,这对于寻求规模较大的收入的投

Mybatis 映射器中使用@InsertProvider,@UpdateProvider,@DeleteProvider,@SelectProvider

上一篇我们介绍了在Mybatis映射器的映射方法中使用@Param接收多个参数;本篇我们继续介绍如何在Mybatis的映射器中使用动态SQL。如果您对Mybatis映射器的映射方法中使用@Param接收多个参数不太了解,建议您先进行了解后再阅读本篇,可以参考:Mybatis映射器中映射方法接受多个参数(@Param)h

【业务功能109】微服务-springcloud-springboot-Skywalking-链路追踪-监控

Skywalkingskywalking是一个apm系统,包含监控,追踪,并拥有故障诊断能力的分布式系统一、Skywalking介绍1.什么是SkyWalkingSkywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin/Pinpoint/CAT的设计思路。特点是:支持多种

Meta-Transformer:基于Transformer的多模态感知,融合Token化与共享编码

论文标题:Meta-Transformer:AUnifiedFrameworkforMultimodalLearning论文地址:https://arxiv.org/pdf/2307.10802.pdf这里写目录标题引言基于Transformer的多模态发展Meta-Transformer框架预备知识数据到序列如何分词

清华、IDEA、港中文联合发表的 DQ-DETR: Dual Query Detection Transformer for Phrase Extraction and Grounding论文阅读笔记

清华、IDEA、港中文联合发表的DQ-DETR:DualQueryDetectionTransformerforPhraseExtractionandGrounding论文阅读笔记一、Abstract二、引言三、PEG&CMAP四、DQ-DETR双queries用于双端检测文本mask引导的注意力损失函数五、实验实施细

【C++】特殊类的设计

文章目录1.设计一个类,不能被拷贝2.设计一个类,不能被继承3.设计一个类,只能在堆上创建对象3.设计一个类,只能在栈上创建对象4.创建一个类,只能创建一个对象(单例模式)饿汉模式懒汉模式1.设计一个类,不能被拷贝💕C++98方式:在C++11之前,想要一个一个类不被拷贝,只有将拷贝构造函数定义为私有,这样在类外就不

RIS 系列 TransVG++: End-to-End Visual Grounding with Language Conditioned Vision Transformer 论文阅读笔记

RIS系列TransVG++:End-to-EndVisualGroundingwithLanguageConditionedVisionTransformer论文阅读笔记一、Abstract二、引言三、相关工作3.1视觉定位两阶段方法单阶段方法视觉编码器的融合3.2Transformer视觉任务中的Transform

MFC-GetSystemFirmwareTable获取系统固件表

获取ACPI表格voidCgetSystemFirmwareTableDlg::OnBnClickedButton1(){//UINTbufferSize=GetSystemFirmwareTable('ACPI',0,NULL,0);//获取系统固件表/*【参数3和参数4为NULL和0,只是为了返回真实大小】这个函数

JUC第五讲:关键字synchronized详解

JUC第五讲:关键字synchronized详解在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。在Java中除了提供LockAPI外,还在语法层面上提供了synchronized关键字来实现互斥同步原语,本文是JUC第五讲,将对synchronized关键字详细分析。文章目

热文推荐