如今 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. 【Docker】本地镜像发布到阿里云

    本地镜像发布到阿里云 本地镜像发布到阿里云流程 镜像的生成方法 1. 前面的DockerFile 2. 从容器创建一个新的镜像 docker commit [OPTIONS] 容器ID [REPOSI ...

  2. access的多个left outer join连接

    虽然你有一万个理由,但是选择ACCESS数据库就是一个不能再蠢的决定. 从AC990账务系统中采集凭证记录,需要做多个左连接.在sql server管理器中执行蛮好,没有问题.可是在程序中就一堆Err ...

  3. 做Docx预览,一定要做这个神库!!

    Hey, 我是 沉浸式趣谈 本文首发于[沉浸式趣谈],我的个人博客 https://yaolifeng.com 也同步更新. 转载请在文章开头注明出处和版权信息. 如果本文对您有所帮助,请 点赞.评论 ...

  4. app自动化的三大等待

    app自动化的三大等待与web自动化的三大等待的代码脚本一样 一.硬性等待 硬性等待无论元素是否出现,都必须等待设置的时间再继续执行后面的代码. 使用简单,但是容易浪费时间.所以一般和隐式等待或显式等 ...

  5. doctrine执行原生sql并直接返回结果集

    直接返回结果集: getConnection反回了\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\Connection.php接口的实现,所以Connec ...

  6. require、include、require_once和use的区别/命名空间的使用方法

    1.require.include require.include都是文件包含,不同的是require语句会输出错误信息,并且立即终止脚本处理.而include语句在没有找到文件时则会输出警告,不会终 ...

  7. C#高性能开发之类型系统:从C# 7.0 到C# 14的类型系统演进全景

    自C# 7.0以来,C#语言在类型系统方面引入了众多新数据类型.类型构造和语言特性,以提升性能.类型安全性和开发效率.本文全面整理了从C# 7.0到C# 14.0(截至2025年4月,C# 14.0为 ...

  8. 基于CNN(卷积神经网络)的车牌号识别【结尾附完整项目下载地址】

    基于卷积神经网络(CNN)的车牌识别技术是一种深度学习方法,用于自动检测并识别车辆的车牌号码.以下是经过优化后的处理步骤: 图像预处理:首先对获取的车牌图像进行处理,包括将其转换为灰度图.二值化处理以 ...

  9. 『Plotly实战指南』--样式定制高级篇

    在数据可视化领域,Plotly不仅是高效的绘图工具,更是设计师的创意画布. 当基础图表已无法满足品牌化需求时,样式定制能力将成为数据叙事的关键武器. 深入的样式定制能够帮助我们打造品牌化图表.实现精准 ...

  10. Hadoop和Spark大数据挖掘与实战

    1.概述 本节将系统讲解大数据分析的完整流程,包括数据采集.预处理.存储管理.分析挖掘与结果可视化等核心环节.与此同时,我们还将对主流数据分析工具进行横向对比,帮助读者根据实际需求选用最合适的工具,提 ...