如今 Vue 大行其道,大部分开发场景直接使用 @click 就实现了事件绑定,可能都没思索过 JS 中的事件性能优化。

事件委托原理

事件委托 其主要是利用了事件冒泡这个特性。

以点击事件 click 为例:将事件绑定在父元素上,点击子元素会通过冒泡的方式触发父元素的点击事件。这种绑定事件的方式,就称之为 事件委托,也称为 事件代理

示例

利用事件委托实现点击 span 元素输出 span 元素内容:

<ul class="parent">
<div>div 内容</div>
<li>第 1 个 li <span>第 1 个 span 内容</span></li>
<li>第 2 个 li <span>第 2 个 span 内容</span></li>
<li>第 3 个 li <span>第 3 个 span 内容</span></li>
<li>第 4 个 li <span>第 4 个 span 内容</span></li>
<li>第 5 个 li <span>第 5 个 span 内容</span></li>
<li>第 6 个 li <span>第 6 个 span 内容</span></li>
<li>第 7 个 li <span>第 7 个 span 内容</span></li>
<li>第 8 个 li <span>第 8 个 span 内容</span></li>
</ul> <script>
(() => {
const parent = document.querySelector('.parent')
parent.addEventListener('click', (event) => {
const target = event.target
// 判断事件响应元素是否是 span
if (target.tagName.toLocaleLowerCase() === 'span') {
console.log(target.innerText)
}
})
})()
</script>

效果:

点击 div 和 li 元素都不会触发事件,点击 span 元素会在控制台输出元素内容。

优点

1、由于 JS 绑定的事件只有一个父元素,所以节省了内存。

2、无需针对每一个子元素绑定事件,所以减少了子元素的事件注册。

3、对于子元素的增删改不用再新注册事件,所以对子元素的操作要简单很多。

4、对于存在大量子元素的页面,由于减少了事件注册次数,所以可以提高页面性能。

缺点

既然事件委托那么有用,那么能不能直接将页面上所有的事件都委托到 body 元素上?

这想法很丰满,但显示很骨感啊,这种情况如果都绑定到最顶层的元素上,那么会导致所有的子元素都会事件冒泡,然后触发顶层元素的事件,这样反而无法做到性能优化,还造成了一些不必要的浪费,毕竟不是所有的子元素都需要响应事件!!

写在最后

性能优化这条路上,一直都存在各种话题,很多性能优化都是过犹不及,适当的场景用适当的方式才是最合理的。

代码编写并不是一蹴而就,很多时候,能实现功能就是好代码,至于性能,在一些小的需求场景,您写的代码可能都无法触发性能问题~~

坚持一个原则:不要过早优化。当我们的代码确实触发了性能问题,再考虑如何优化吧~~

Web前端入门第 75 问:JavaScript 性能优化之事件委托(事件代理)原理的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. web前端开发,如何提高页面性能优化?

    内容方面: 1.减少 HTTP 请求 (Make Fewer HTTP Requests) 2.减少 DOM 元素数量 (Reduce the Number of DOM Elements) 3.使得 ...

  3. Android零基础入门第75节:Activity状态和生命周期方法

    前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还需要学习了解更多. 生命周期就是一个对象从创建到销毁的过程,每一个对象 ...

  4. 摘:JavaScript性能优化小知识总结

    原文地址:http://www.codeceo.com/article/javascript-performance-tips.html JavaScript的性能问题不容小觑,这就需要我们开发人员在 ...

  5. JavaScript性能优化小窍门汇总(含实例)

    在众多语言中,JavaScript已经占有重要的一席之地,利用JavaScript我们可以做很多事情 , 应用广泛.在web应用项目中,需要大量JavaScript的代码,将来也会越来越多.但是由于J ...

  6. JavaScript性能优化小知识总结(转)

    JavaScript的性能问题不容小觑,这就需要我们开发人员在编写JavaScript程序时多注意一些细节,本文非常详细的介绍了一下JavaScript性能优化方面的知识点,绝对是干货. 前言 一直在 ...

  7. JavaScript性能优化

    如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍J ...

  8. JavaScript性能优化篇js优化

    JavaScript性能优化篇js优化   随着Ajax越来越普遍,Ajax引用的规模越来越大,Javascript代码的性能越来越显得重要,我想这就是一个很典型的例子,上面那段代码因为会被频繁使用, ...

  9. javascript性能优化-repaint和reflow

    repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的情况下发生,如改变outline,visibility,background color,不会影响到dom结构渲 ...

  10. Javascript 性能优化的一点技巧

    把优秀的编程方式当成一种习惯,融入到日常的编程当中.下图是今天想到的一点Javascript 性能优化的技巧,分享一下,抛砖引玉.

随机推荐

  1. Linux下时区/系统时间/硬件时间的设置

    涨姿势,顺带笔记,留爪. 先简述下时区/系统时间/硬件时间的3个主要命令吧 tzselect tzselect命令主要针对时区设置和查看 tz=timezone的缩写,直译=时区 date date命 ...

  2. 在 Idea 中使用 Git

    以 git-2.21.0 为例说明安装步骤: 双击 Git-2.21.0-64-bit.exe 点击 Next 设置安装路径 点击 Next 点击 Next 点击 Next,选择默认的编辑器 点击 N ...

  3. Nginx开机启动(Linux环境下)

    1.环境 centos6 2.描述 设置Nginx开机启动,当服务器重启后,可自行启动nginx 3.方案一 3.1.创建nginx.service文件 vim /usr/lib/systemd/sy ...

  4. AspNetCore 请求产生 FreeSql 所有操作 SQL 日志输出到前端

    第一步:定义注入类型 public class CurdAfterLog : IDisposable { public static AsyncLocal<CurdAfterLog> Cu ...

  5. 25.9K star!AI一键生成高清短视频,这个开源神器让内容创作起飞!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "MoneyPrinterTurbo 是基于AI大模型的全自动短视频生成工具,只需 ...

  6. java设置权限过滤器--防止用户未登录访问某些页面

    话不多说,上代码!!! package com.store.web.filter; import java.io.IOException; import javax.servlet.Filter; i ...

  7. XGBooost算法原理及Python实现

    一.概述   XGBoost 是一种基于梯度提升框架的机器学习算法,它通过迭代地训练一系列决策树来构建模型.核心思想是通过不断地在已有模型的基础上,拟合负梯度方向的残差(真实值与预测值的差)来构建新的 ...

  8. 【记录】IDA|IDA设置text view为默认,并解决IDA7.6打开新固件卡顿的问题

    版本:IDA Pro 7.6 Graph View(控制流视图)其实我真的看得很少,因为遇到分析难题时总是是因为间接调用,它根本分析不出来.但是一开IDA它就自动分析这个特别卡.所以今天想彻底解决一下 ...

  9. 【记录】SMB|Windows下修改SMB端口并挂载

    环境:Window11 使用背景:勒索病毒导致445端口不安全,故而该端口在服务器端被全面禁用了,如需使用SMB服务需要换个SMB服务端口. 方法1:端口转发 win+x点开管理员权限的终端: 输入如 ...

  10. trae开发的win10端口占用检测工具

    前言 首先,强烈安利字节开发的工具:https://www.trae.com.cn/ 以下代码均由此工具生成. linux 中可以使用 lsof -i:端口号 查看端口占用进程,并使用kill指令杀死 ...