JavaScript中的事件代理(Event Delegation)

聚沙成塔·每天进步一点点


本文回顾

  • ⭐ 专栏简介
  • JavaScript中的事件代理(Event Delegation)
    • 1. 引言
    • 2. 事件代理的概念
      • 2.1 概述
      • 2.2 事件冒泡
    • 3. 事件代理的工作原理
      • 3.1 绑定事件处理程序
      • 3.2 检查事件目标
    • 4. 事件代理的实现
      • 4.1 基本示例
      • 4.2 动态添加元素
    • 5. 事件代理的优点
      • 5.1 提高性能
      • 5.2 简化代码
      • 5.3 动态内容支持
    • 6. 总结
  • ⭐ 写在最后

⭐ 专栏简介

前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个专栏中,我们将以问答形式每天更新,为大家呈现精选的前端知识点和常见问题解答。通过问答形式,我们希望能够更直接地回应读者们对于前端技术方面的疑问,并且帮助大家逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是各种常用框架和工具,我们将深入浅出地解释概念,并提供实际案例和练习来巩固所学内容。同时,我们也会分享一些实用技巧和最佳实践,帮助你更好地理解并运用前端开发中的各种技术。

在这里插入图片描述

无论你是寻找职业转型、提升技能还是满足个人兴趣,我们都将全力以赴,为你提供最优质的学习资源和支持。让我们一起探索Web开发的奇妙世界吧!加入前端入门之旅,成为一名出色的前端开发者! 让我们启航前端之旅!!!

今日份内容:JavaScript中的事件代理(Event Delegation)

在这里插入图片描述


JavaScript中的事件代理(Event Delegation)

1. 引言

事件代理(Event Delegation)是JavaScript中处理事件的一种重要技术,通过利用事件冒泡机制,可以将事件处理程序添加到一个父元素上,而不是为每个子元素单独添加事件处理程序。这样可以提高性能和简化代码管理。本文将详细介绍事件代理的概念、工作原理、实现方法及其优点。

2. 事件代理的概念

2.1 概述

事件代理是一种利用事件冒泡机制,在父元素上管理子元素事件的技术。事件冒泡是指事件从触发的元素开始,一直向上冒泡到最顶层的祖先元素(通常是document对象)。

2.2 事件冒泡

事件冒泡是DOM事件流的一部分,指事件从目标元素开始向上传播至根元素(document)的过程。

<div id="parent"><button id="child">Click me</button>
</div>

在上面的例子中,如果点击按钮,事件将从按钮冒泡到父div,再冒泡到document。

3. 事件代理的工作原理

3.1 绑定事件处理程序

在事件代理中,事件处理程序绑定在父元素上,而不是每个子元素。

document.getElementById('parent').addEventListener('click', function(event) {if (event.target && event.target.id === 'child') {console.log('Button clicked!');}
});

3.2 检查事件目标

在事件处理程序中,通过检查event.target来确定实际触发事件的子元素。这样可以在父元素上处理子元素的事件。

4. 事件代理的实现

4.1 基本示例

以下示例展示了如何使用事件代理处理多个按钮的点击事件,而不需要为每个按钮单独添加事件处理程序。

<div id="button-container"><button class="btn">Button 1</button><button class="btn">Button 2</button><button class="btn">Button 3</button>
</div><script>document.getElementById('button-container').addEventListener('click', function(event) {if (event.target && event.target.classList.contains('btn')) {console.log(event.target.textContent + ' clicked');}});
</script>

4.2 动态添加元素

事件代理对于动态添加的元素也非常有用,因为在父元素上绑定事件处理程序可以自动处理新添加的子元素事件。

<div id="list-container"><ul id="item-list"><li>Item 1</li><li>Item 2</li></ul><button id="add-item">Add Item</button>
</div><script>document.getElementById('item-list').addEventListener('click', function(event) {if (event.target && event.target.tagName === 'LI') {console.log(event.target.textContent + ' clicked');}});document.getElementById('add-item').addEventListener('click', function() {var newItem = document.createElement('li');newItem.textContent = 'New Item';document.getElementById('item-list').appendChild(newItem);});
</script>

5. 事件代理的优点

5.1 提高性能

在父元素上绑定一个事件处理程序,比为每个子元素单独绑定事件处理程序性能更高,尤其是在子元素数量较多时。

5.2 简化代码

事件代理减少了事件处理程序的数量,使代码更简洁、更易于维护。

5.3 动态内容支持

对于动态添加或删除的子元素,事件代理可以自动处理,不需要额外的事件绑定或解绑逻辑。

6. 总结

事件代理是JavaScript中处理事件的一种高效技术,通过在父元素上管理子元素的事件处理,可以显著提高性能和简化代码管理。理解事件代理的工作原理和实现方法,并在实际项目中灵活应用,可以帮助开发者编写更高效、更易维护的代码。


⭐ 写在最后

本专栏适用读者比较广泛,适用于前端初学者;或者没有学过前端对前端有兴趣的伙伴,亦或者是后端同学想在面试过程中能够更好的展示自己拓展一些前端小知识点,所以如果你具备了前端的基础跟着本专栏学习,也是可以很大程度帮助你查漏补缺,由于博主本人是自己再做内容输出,如果文中出现有瑕疵的地方各位可以通过主页的左侧联系我,我们一起进步,与此同时也推荐大家几份专栏,有兴趣的伙伴可以订阅一下:除了下方的专栏外大家也可以到我的主页能看到其他的专栏;

前端小游戏(免费)这份专栏将带你进入一个充满创意和乐趣的世界,通过利用HTML、CSS和JavaScript的基础知识,我们将一起搭建各种有趣的页面小游戏。无论你是初学者还是有一些前端开发经验,这个专栏都适合你。我们会从最基础的知识开始,循序渐进地引导你掌握构建页面游戏所需的技能。通过实际案例和练习,你将学会如何运用HTML来构建页面结构,使用CSS来美化游戏界面,并利用JavaScript为游戏添加交互和动态效果。在这个专栏中,我们将涵盖各种类型的小游戏,包括迷宫游戏、打砖块、贪吃蛇、扫雷、计算器、飞机大战、井字游戏、拼图、迷宫等等。每个项目都会以简洁明了的步骤指导你完成搭建过程,并提供详细解释和代码示例。同时,我们也会分享一些优化技巧和最佳实践,帮助你提升页面性能和用户体验。无论你是想寻找一个有趣的项目来锻炼自己的前端技能,还是对页面游戏开发感兴趣,前端小游戏专栏都会成为你的最佳选择。点击订阅前端小游戏专栏

在这里插入图片描述

Vue3通透教程【从零到一】(付费) 欢迎来到Vue3通透教程!这个专栏旨在为大家提供全面的Vue3相关技术知识。如果你有一些Vue2经验,这个专栏都能帮助你掌握Vue3的核心概念和使用方法。我们将从零开始,循序渐进地引导你构建一个完整的Vue应用程序。通过实际案例和练习,你将学会如何使用Vue3的模板语法、组件化开发、状态管理、路由等功能。我们还会介绍一些高级特性,如Composition API和Teleport等,帮助你更好地理解和应用Vue3的新特性。在这个专栏中,我们将以简洁明了的步骤指导你完成每个项目,并提供详细解释和示例代码。同时,我们也会分享一些Vue3开发中常见的问题和解决方案,帮助你克服困难并提升开发效率。无论你是想深入学习Vue3或者需要一个全面的指南来构建前端项目,Vue3通透教程专栏都会成为你不可或缺的资源。点击订阅Vue3通透教程【从零到一】专栏

在这里插入图片描述

TypeScript入门指南(免费) 是一个旨在帮助大家快速入门并掌握TypeScript相关技术的专栏。通过简洁明了的语言和丰富的示例代码,我们将深入讲解TypeScript的基本概念、语法和特性。无论您是初学者还是有一定经验的开发者,都能在这里找到适合自己的学习路径。从类型注解、接口、类等核心特性到模块化开发、工具配置以及与常见前端框架的集成,我们将全面覆盖各个方面。通过阅读本专栏,您将能够提升JavaScript代码的可靠性和可维护性,并为自己的项目提供更好的代码质量和开发效率。让我们一起踏上这个精彩而富有挑战性的TypeScript之旅吧!点击订阅TypeScript入门指南专栏

在这里插入图片描述

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

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

相关文章

易编橙·终身成长社群:帮助编程小伙伴少走弯路

&#x1f34a; 目录 &#x1f34a; 自我介绍 &#x1f34a; 如何加入&#xff1f; &#x1f34a; 【擅长的技术】 &#x1f34a; 星主介绍 &#x1f34a; 星球天团 &#x1f34a; 易编橙终身成长社群介绍及权益&#xff5e; &#x1f34a; 受众群体 &#x1f34a; 如何…

Chapter 8 Feedback

Chapter 8 Feedback 这一章我们介绍feedback 反馈运放的原理. 负反馈是模拟电路强有力的工具. 8.1 General Considerations 反馈系统如下图所示 Aolamp open-loop gain即开环增益. Aolxo/xi β \beta β 是 feedback factor, 注意方向. β x f x o \beta\frac{x_{f}}{x_{o…

C++视觉开发 三.缺陷检测

一.距离变换 1.概念和功能 距离变换是一种图像处理技术&#xff0c;用于计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距离。它常用于图像分割、形态学操作和形状分析等领域。它计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距…

Hadoop权威指南-读书笔记-01-初识Hadoop

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 第一章—初识Hadoop Tips&#xff1a; 这个引例很有哲理嘻嘻&#x1f604;&#xff0c;道出了分布式的灵魂。 1.1 数据&#xff01;数据&#xff01; 这一小节主要介绍了进入大数据时代&#xff0c;面…

喜讯|华院计算认知智能引擎算法平台荣登BPAA大赛创新组TOP50

6月25日&#xff0c;备受瞩目的BPAA第四届全球应用算法模型典范大赛&#xff08;以下简称“BPAA大赛”&#xff09;正式揭晓了《第四届全球应用算法模型典范大赛创业组TOP50榜单》和《第四届全球应用算法模型典范大赛创新组TOP50榜单》。其中&#xff0c;华院计算技术&#xff…

SpringBoot中整合ONLYOFFICE在线编辑

SpringBoot整合OnlyOffice SpringBoot整合OnlyOffice实现在线编辑1. 搭建私有的OnlyOffice的服务2. SpringBoot进行交互2.1 环境2.2 我们的流程2.3 接口规划2.3.1 获取编辑器配置的接口2.3.2 文件下载地址2.3.3 文件下载地址 3. 总结4. 注意4.1 你的项目的地址一定一定要和only…

HttpServletResponse设置headers返回,发现headers中缺少“Content-Length“和“Content-Type“两个参数。

业务中需要将用httpUtils请求返回的headers全部返回&#xff0c;塞到HttpServletResponse中&#xff0c;代码如下&#xff1a; HttpServletResponse response;// 返回headers Arrays.stream(httpResponse.getHeaders()).forEach(header -> response.setHeader(header.getNa…

Kimi 上下文缓存功能开启公测!降低使用费用,加快模型相应速度

7月2日&#xff0c;系统之家发布消息&#xff0c;月之暗面科技有限公司旗下的Kimi开放平台正式推出上下文缓存功能&#xff0c;并已开放公测。这项功能专为处理频繁请求和大量重复引用初始上下文的场景设计&#xff0c;能有效降低使用长文本模型的成本&#xff0c;并显著提升处…

React小记(五)_Hooks入门到进阶

React 16.8 版本 类组件 和 函数组件 两种组件共存&#xff0c;到目前 React 18 版本&#xff0c;官方已经不在推荐使用类组件&#xff0c;在函数组件中 hooks 是必不可少的&#xff0c;它允许我们函数组件像类组件一样可以使用组件的状态&#xff0c;并模拟组件的生命周期等一…

ChatGPT-4o医学应用、论文撰写、数据分析与可视化、机器学习建模、病例自动化处理、病情分析与诊断支持

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年11月7日&#xff0c;OpenAI首届开发者大会被称为“科技界的春晚”&#xff0c;吸引了全球广大…

Cesium大屏-vue3注册全局组件

1.需求 说明&#xff1a;产品经理要求开发人员在地图大屏上面随意放置组件&#xff0c;并且需要通过数据库更改其组件大小&#xff0c;位置等&#xff1b;适用于大屏组件中场站视角、任意位置标题等。 2.实现 2.1GlobalComponents.vue 说明&#xff1a;containerList可以通…

力扣热100 哈希

哈希 1. 两数之和49.字母异位词分组128.最长连续序列 1. 两数之和 题目&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。…

蜜雪冰城小程序逆向

app和小程序算法一样 小程序是wasm

SpringMVC的视图

文章目录 1、ThymeleafView2、转发视图3、重定向视图4、视图控制器view-controller SpringMVC 中的视图是 View 接口&#xff0c;视图的作用渲染数据&#xff0c;将模型 Model 中的数据展示给用户SpringMVC视图的种类很多&#xff0c;默认有转发视图和重定向视图当工程引入jstl…

楼层分户项目分析

文章目录 1. 区域绘制2. 户型切分3. 楼房分层4. 编辑房户信息5. 查看房户信息6. 数据库6.1. 楼栋数据库6.2. 单位数据库 7. 房户数据库 1. 区域绘制 点击绘制图形&#xff0c;激活画笔&#xff0c;右键结束绘制。 输入框可以更换地址前缀。 分户坐标是由绘制的多个点组成的&…

在宿主机上个修改虚拟机的用户密

1、远程修改虚拟机密码 1.1在虚拟机上安装Qemu Guest Agent yum -y install qemu-guest-agent --enablerepoC7.4* systemctl enable qemu-guest-agent systemctl start qemu-guest-agent vim /etc/sysconfig/qemu-ga #注释此行 systemctl restart qemu-guest-agent.servic…

LabVIEW电压电流实时监测系统

开发了一种基于LabVIEW和研华&#xff08;Advantech&#xff09;数据采集卡的电压电流实时监测系统&#xff0c;通过高效的数据采集和处理&#xff0c;为工业和科研用户提供高精度、实时的电压电流监测解决方案。系统采用研华USB-4711A数据采集卡&#xff0c;结合LabVIEW编程环…

SAP 接口-银行账号主数据维护接口【MDM->SAP】开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

接口映射字段 开发通用说明 根据MDM传输字段调用BAPI生成银行账号及开户行。 开户行维护BAPI【BAPI_BANK_CREATE】 银行账号维护BAPI【BAPI_FCLM_BAM_AMD_BNKANT】 接口字段【ZZZH 主账户标识】=1时字段【DTAAI】DME标识赋值:常用; 接口字段【ZZZH 主账户标识】=0时字段…

[C++][设计模式][迭代器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件构建过程中&#xff0c;集合对象内部结构常常变化各异。但对于这些集合对象&#xff0c;我们希望不暴露其内部结构的同时&#xff0c;可以让外部客户代码透明地访问其中包含的元素&#xff1b; 同时这种”透明遍历“也…

Optional类方法

Optional类 简介方法empty()方法of(T value)ofNullable(T value)filter(Predicate<? super T> predicate)get()ifPresent(Consumer<? super T> consumer)isPresent()map(Function<? super T,? extends U> mapper)orElse(T other)orElseGet(Supplier<?…