【JS】节流与防抖技术

ops/2024/11/14 3:26:57/

JavaScript: 节流与防抖技术

当用户进行滚动、调整窗口大小或进行频繁的键盘输入时,页面上的某些事件处理器可能会被频繁触发。如果每次事件触发都执行函数,可能会对性能产生显著影响。在这种情况下,我们可以利用节流(Throttle)和防抖(Debounce)技术来优化性能。

节流(Throttle)

节流是一种限制函数执行频率的技术。使用节流时,函数在一个固定的时间间隔内只被允许执行一次。即使在这个时间间隔内事件被多次触发,函数也只会执行一次。

这种技术特别适用于处理如滚动事件和窗口大小调整这样的事件,因为它们可能会在短时间内被频繁触发。

实现节流函数

下面是一个如何实现节流函数的示例:

javascript">function throttle(func, limit) {let lastFunc;let lastRan;return function() {const context = this;const args = arguments;if (!lastRan) {func.apply(context, args);lastRan = Date.now();} else {clearTimeout(lastFunc);lastFunc = setTimeout(function() {if ((Date.now() - lastRan) >= limit) {func.apply(context, args);lastRan = Date.now();}}, limit - (Date.now() - lastRan));}}
}

你可以这样使用它:

javascript">window.addEventListener('resize', throttle(function() {console.log('Resize event handler called every 1000ms');
}, 1000));

防抖(Debounce)

与节流相比,防抖技术延迟函数的执行直到事件停止触发后一段时间。如果在等待时间内事件再次被触发,则延时将重新开始。

这种技术适用于那些我们只关心事件触发后结果而不关心过程的情况,例如搜索框输入。

实现防抖函数

以下是实现防抖函数的示例:

javascript">function debounce(func, delay) {let inDebounce;return function() {const context = this;const args = arguments;clearTimeout(inDebounce);inDebounce = setTimeout(() => func.apply(context, args), delay);}
}

使用方法如下:

javascript">const input = document.getElementById('input');
input.addEventListener('keyup', debounce(function() {console.log('Input value:', this.value);
}, 300));

选择正确的技术

节流和防抖都是优化高频事件触发情况下函数执行的有效手段。使用节流时,函数在固定时间内只执行一次,适合频繁发生的事件。而使用防抖时,函数只在最后一次事件触发一段时间后执行,适合对结果敏感的场景。

选择节流还是防抖,取决于你的具体需求。如果你需要在事件频繁发生时减少函数的执行频率,那么节流是一个好选择。如果你需要确保函数只在事件触发结束后执行,那么防抖可能更适合。

结论

了解和应用节流与防抖技术,可以帮助我们提升页面性能,提高用户体验。在开发过程中合理地使用它们,可以避免不必要的函数执行,从而节省计算资源并减轻页面负担。


http://www.ppmy.cn/ops/23877.html

相关文章

基于Springboot的滑雪场管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的滑雪场管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&a…

Manim - Python 绘画引擎

文章目录 关于 Manim安装manim 有两个版本要求直接使用 pip使用源码安装 使用 manimManual 关于 Manim Manim : Mathematical Animation,是由 Grant Sanderson 开发,是一个用于精确编程动画的引擎,专为创建解释性数学视频而设计。 github :…

navicat连接postgresql报错解决方案

navicat连接postgresql报错解决方案 问题描述原因分析:解决方案:1、将navicat升级到16.2以上版本2、降级pgsql3、修改dll配置文件 问题描述 使用Navicat连接postgresql时,出现如下错误。 原因分析: 由于pgsql 15版本以后&#…

java-Spring-(MyBatis框架-xml管理)

目录 前置条件 xml与注解比较 1.1 xml定义 1.2 和SQL注解比较 建包准备 插入数据 ​编辑 更新数据 删除数据 查询数据 查看单字段查询 🏷💣前置条件 创建一个spring boot 初始化的项目 🏷💣xml与注解比较 1.1 xml定义 …

优路教育:提质数字人才培育,增效数字经济发展

为发挥数字人才支撑数字经济的基础性作用,加快推动形成新质生产力,相关部门于近日联合发布《加快数字人才培育支撑数字经济发展行动方案(2024-2026年)》(以下简称方案),要求紧贴数字…

竟然还有这么省钱方便的寄快递方式?你竟然不知道!

选择闪侠惠递平台寄快递,这个价格来说真的很亲民了,而且可以多家快递进行比较,全国上门取件,这个真的很不错了。闪侠惠递是个靠谱的平台,售后以及取件率都必须好的。 闪侠惠递平台折扣力度非常棒的!因为渠…

安卓手机APP开发__媒体开发部分__APK裁剪

安卓手机APP开发__媒体开发部分__APK裁剪 目录 概述 仅使用必要的依赖 启用代码和资源的裁剪 指定你的APP需要哪一个渲染器 指定你的APP需要哪个抽取器 定制媒体源的实例化 概述 最小化APK的大小是开发一个好的安卓APP的一个重要的方面.当面向的是正在开发 的市场时更是…

朋友们,帮忙填写一个问卷呀!关于高速服务区一体化车流管理系统的线上调研,急需各位大神的帮助!!!

✌ 作者简介:瑞骏 RUIJUN 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 💬 人生格言:没有我不会的语言,没有你过不去的坎儿。💬 &#x…