JS进阶DAY3|事件(三)事件委托

目录

一、事件委托

1.1 概念

1.2 代码示例

二、tab栏切换案例


一、事件委托

1.1 概念

事件委托是一种在JavaScript中常用的技术,它利用了DOM事件冒泡的原理。事件冒泡是指当在DOM树中较低层次的元素上发生事件时,这个事件会向上冒泡到更高层次的元素,直到文档的根元素。事件委托通过在父元素上设置一个事件监听器来处理所有子元素的事件,无论这些子元素是静态的还是动态添加的。

想象一下,你是一个大型图书馆的管理员,而你的任务是响应读者的请求。图书馆有很多书架(DOM中的子元素),每个书架上都摆满了书籍。读者可能会在任何书架前提出请求,比如需要某本书或者帮助,你有一下两种解决方法:

  1. 单独响应:如果你为每个书架安排一个工作人员,那么每当有读者提出请求时,相应的工作人员就需要响应。这就像是为DOM中的每个子元素单独绑定事件监听器。这样做的缺点是,如果图书馆有很多书架,你就需要很多工作人员,这不仅成本高,而且难以管理。
  2. 事件委托:相反,你可以在图书馆的入口处设置一个信息台,并安排一个接待员。这个接待员(事件监听器)会注意到任何读者的请求,并根据请求的来源(哪个书架)来提供帮助。这就像是在父元素(图书馆)上设置一个事件监听器来处理所有子元素(书架)的事件。

1.2 代码示例

在JavaScript中,这个“信息台”对应于DOM中的父元素,比如一个 <ul> 标签,它包含了多个 <li> 子元素。

事件监听器作为接待员:这个“接待员”对应于事件监听器,它被附加到父元素上,而不是每个子元素上。

事件冒泡作为请求信号:当读者(子元素)提出请求(事件)时,这个请求会像事件冒泡一样,从子元素传递到父元素,直到到达信息台(父元素的事件监听器)。

区分请求来源:在事件处理程序中,通过 event.target (事件的实际目标),接待员(事件监听器)可以确定是哪个读者(子元素)发出的请求,从而提供相应的服务。

// 父元素(图书馆)上的事件监听器(接待员)const library = document.getElementById('library');library.addEventListener('click', function(e) {// 检查请求是否来自读者(<li>元素)if (e.target.tagName === 'LI') {// 根据请求的来源提供帮助console.log('Reader at bookshelf ' + e.target.textContent + ' needs assistance.');}});

library 是父元素(图书馆), e.target 是实际触发事件的元素(读者所在的书架)。通过在父元素上设置一个事件监听器,我们可以处理所有子元素的事件,就像接待员可以响应所有读者的请求一样。这样,无论何时有新的“书架”( <li> 元素)加入“图书馆”( <ul> 元素),我们都不需要额外的“工作人员”(不需要为每个新元素绑定事件监听器)。这就是事件委托的力量和便利性。

了解了基本的用法后让我们来做一个简单的tab栏切换小案例吧~

二、tab栏切换案例

// 查询页面上class为'tab-nav'的元素内部的ul元素,并将其存储在变量`ul`中。
const ul = document.querySelector('.tab-nav ul');// 为ul元素添加一个点击事件监听器。
ul.addEventListener('click', function(e){// 如果被点击的元素(e.target)的tagName是'A',即点击的是<a>标签。if (e.target.tagName == 'A'){// 首先,移除当前活跃(active)状态的<a>标签的'active'类。document.querySelector('.tab-nav .active').classList.remove('active');// 给被点击的<a>标签添加'active'类,标记为当前活跃状态。e.target.classList.add('active');// 获取被点击的<a>标签的data-id属性值,并转换为整数。const i = +e.target.dataset.id;// 移除当前活跃状态的tab内容区域的'active'类。document.querySelector('.tab-content .active').classList.remove('active');// 根据被点击的<a>标签的data-id属性值,找到对应的tab内容区域,并添加'active'类。// `.item:nth-child(${i + 1})`是一个CSS选择器,用于选择第i+1个.item元素。document.querySelector(`.tab-content .item:nth-child(${i + 1})`).classList.add('active');}
});

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Y3编辑器文档4:触发器1(对话、装备、特效、行为树、排行榜、不同步问题)

文章目录 一、触发器简介1.1 触发器界面1.2 ECA语句编辑及快捷键1.3 参数设置1.4 变量设置1.5 实体触发器1.6 函数库与触发器复用 二、触发器的多层结构2.1 子触发器&#xff08;在游戏内对新的事件进行注册&#xff09;2.2 触发器变量作用域2.3 复合条件2.4 循环2.5 计时器2.6…

LoRA:低秩分解微调与代码

传统的微调&#xff0c;即微调全量参数&#xff0c;就是上面的公式&#xff0c;但是我们可以通过两个矩阵&#xff0c;来模拟这个全量的矩阵&#xff0c;如果原来的W是(N * N)维度&#xff0c;我们可以通过两个(N * R) 和 (R * N)的矩阵矩阵乘&#xff0c;来模拟微调的结果。 …

鸿蒙系统-前端0帧起手

鸿蒙系统-前端0帧起手 先search 一番 找到对应的入门文档1. 运行项目遇到问题 如下 &#xff08;手动设计npm 的 registry 运行 npm config set registry https://registry.npmjs.org/&#xff09;2.运行后不支持一些模拟器 配置一下&#xff08;如下图&#xff0c;运行成功&am…

Java面试之实现多线程(二)

此篇接上一篇Java面试之什么是多线程(一) Java多线程是Java语言中的一个重要特性&#xff0c;它可以实现并发处理、提高程序的性能和响应能力。开发者需要了解多线程的概念和机制&#xff0c;并采用合适的多线程编程模型和同步机制&#xff0c;以保证程序的正确性和稳定性。Jav…

酒店/电影推荐系统里面如何应用深度学习如CNN?

【1】酒店推荐系统里面如何应用CNN&#xff1f;具体过程是什么 在酒店推荐系统中应用卷积神经网络&#xff08;CNN&#xff09;并不是一个常见的选择&#xff0c;因为 CNN 主要用于处理具有空间结构的数据&#xff0c;如图像、音频和某些类型的序列数据。然而&#xff0c;在某…

三、nginx实现lnmp+discuz论坛

lnmp l&#xff1a;linux操作系统 n&#xff1a;nginx前端页面 m&#xff1a;mysql数据库&#xff0c;账号密码&#xff0c;数据库等等都保存在这个数据库里面 p&#xff1a;php——nginx擅长处理的是静态页面&#xff0c;页面登录账户&#xff0c;需要请求到数据库&#…

03篇--二值化与自适应二值化

二值化 定义 何为二值化&#xff1f;顾名思义&#xff0c;就是将图像中的像素值改为只有两种值&#xff0c;黑与白。此为二值化。 二值化操作的图像只能是灰度图&#xff0c;意思就是二值化也是一个二维数组&#xff0c;它与灰度图都属于单信道&#xff0c;仅能表示一种色调…

CV之UIGM之OmniGen:《OmniGen: Unified Image Generation》翻译与解读

CV之UIGM之OmniGen&#xff1a;《OmniGen: Unified Image Generation》翻译与解读 导读&#xff1a;这篇论文介绍了OmniGen&#xff0c;一个用于统一图像生成的扩散模型。 >> 背景痛点&#xff1a;目前的图像生成模型大多专注于特定任务&#xff0c;例如文本到图像生成。…

数据分析python小工具录入产品信息到Excel

在没有后台管理系统的时候&#xff0c;有时候为了方便起见&#xff0c;想提供一个输入框让运营人员直接输入&#xff0c;然后数据就会以数据库的形式存进数据库 效果图&#xff1a; 输入用户名 输入数据 输入信息后点击添加到表格&#xff0c;检查后方便批量保存到excel …

scala的泛型2

package test55 //隐式转换 //1.隐式函数 //2.隐式类 //3.隐式对象 //4.函数的隐式参数//泛型&#xff1a;类型参数化。 //Pair 约定一对数据 class Pair[T](var x:T, var y:T) //泛型的应用场景&#xff1a; //1.泛型函数 //2.泛型类 //3.泛型特质 object test2 {def main(arg…

【刷题22】BFS解决最短路问题

目录 一、边权为1的最短路问题二、迷宫中离入口最近的出口三、最小基因变化四、单词接龙五、为高尔夫比赛砍树 一、边权为1的最短路问题 如图&#xff1a;从A到I&#xff0c;怎样走路径最短 一个队列一个哈希表队列&#xff1a;一层一层递进&#xff0c;直到目的地为止哈希表&…

Google Cloud Database Option(数据库选项说明)

关系数据库 在关系数据库中&#xff0c;信息存储在表、行和列中&#xff0c;这通常最适合结构化数据。因此&#xff0c;它们用于数据结构不经常更改的应用程序。与大多数关系数据库交互时使用 SQL&#xff08;结构化查询语言&#xff09;。它们为数据提供 ACID 一致性模式&am…

【Java 学习】面向程序的三大特性:封装、继承、多态

引言 1. 封装1.1 什么是封装呢&#xff1f;1.2 访问限定符1.3 使用封装 2. 继承2.1 为什么要有继承&#xff1f;2.2 继承的概念2.3 继承的语法2.4 访问父类成员2.4.1 子类中访问父类成员的变量2.4.2 访问父类的成员方法 2.5 super关键字2.6 子类的构造方法 3. 多态3.1 多态的概…

PAT甲级-1114 Family Property

题目 题目大意 共有n个户主&#xff0c;每个户主的房产按照“ 户主id 父亲id 母亲id 孩子个数 孩子的id 房产数 房产面积 ”的格式给出。如果父亲或母亲不存在&#xff0c;值为-1。每个户主及其父亲母亲孩子可以构成一个家庭&#xff0c;不同户主如果有相同的家人&#xff0c;…

如何不重启修改K8S containerd容器的内存限制(Cgroup方法)

1. 使用crictl 查看容器ID crictl ps2. 查看Cgroup位置 crictl inspect 容器ID3. 到容器Cgroup的目录下 使用上个命令就能找到CgroupPath 4 . 到cgroup目录下 正确目录是 : /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf68e18…

《计算机视觉:瓶颈之辩与未来之路》

一、计算机视觉的崛起 计算机视觉是使用计算机模仿人类视觉系统的科学&#xff0c;让计算机拥有类似人类提取、处理、理解和分析图像以及图像序列的能力。它是一个多学科交叉的领域&#xff0c;与机器视觉、图像处理、人工智能、机器学习等领域密切相关。 计算机视觉行业可分为…

Burp suite2 (泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…

Scala中求汉罗塔游戏

记&#xff1a;f(n,"A","B","C")表示n个盘子从A柱子上移动到C柱子上&#xff0c;借用B柱子的过程 f(要移动的盘子的个数&#xff0c;起点&#xff0c;辅助柱子&#xff0c;终点) 1.基本情况(直接能求的)&#xff1a;f(1,"A",&…

mac 安装CosyVoice (cpu版本)

CosyVoice 介绍 CosyVoice 是阿里研发的一个tts大模型 官方项目地址&#xff1a;https://github.com/FunAudioLLM/CosyVoice.git 下载项目&#xff08;非官方&#xff09; git clone --recursive https://github.com/v3ucn/CosyVoice_for_MacOs.git 进入项目 cd CosyVoic…

C++50道经典面试题

文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 导读 作为一种通用且面向对…