关于javascript中防抖和节流的使用详解

防抖(Debounce)节流(Throttle)是两种常见的优化技巧,通常用于控制函数在短时间内频繁触发的场景,尤其是在处理用户输入、滚动、窗口大小调整等事件时。它们的主要目的是减少不必要的函数调用,从而提高性能和用户体验。

1. 防抖(Debounce)

防抖是指在事件触发后的一段时间内不再触发该事件,只有当事件停止触发一定时间后,才执行一次函数。每次事件触发时,如果在设定的时间间隔内再次触发,则会重新计时。

  • 应用场景
    • 搜索框输入:用户输入停止后才发送请求,避免每次按键都触发请求。
    • 窗口大小变化:在用户停止调整窗口大小后,重新布局。
防抖的实现(以 JavaScript 为例)
function debounce(fn, delay) {let timer;return function (...args) {const context = this;clearTimeout(timer);  // 清除之前的定时器timer = setTimeout(() => {fn.apply(context, args);  // 重新设置定时器}, delay);};
}
  • 解释
    • 每次调用 debounce 返回的函数时,会先清除上一次的定时器,然后重新设置一个新的定时器。
    • 当持续触发该事件时,之前的定时器会不断被清除,直到最后一次事件结束后,才会执行目标函数 fn
使用示例
// 假设我们有一个处理输入框的函数
function handleInput() {console.log('Input value:', document.getElementById('input').value);
}// 我们希望在用户停止输入后的 500ms 执行
const debouncedInputHandler = debounce(handleInput, 500);document.getElementById('input').addEventListener('input', debouncedInputHandler);

2. 节流(Throttle)

节流是指在连续触发事件时,保证一定时间间隔内只执行一次函数,即函数调用是固定频率的,而不会因为事件频繁触发而频繁执行。

  • 应用场景
    • 页面滚动:限制滚动事件的回调频率,防止滚动时函数被频繁调用。
    • 按钮点击:防止用户多次点击按钮,触发多次事件。
    • 监听鼠标移动:在拖动或滚动页面时限制频繁的回调。
节流的实现
function throttle(fn, interval) {let lastTime = 0;return function (...args) {const now = Date.now();if (now - lastTime >= interval) {lastTime = now;fn.apply(this, args);  // 执行目标函数}};
}
  • 解释
    • lastTime 记录上一次执行函数的时间。
    • 当函数触发时,检查当前时间 nowlastTime 的差值,如果超过设定的 interval,则执行函数并更新 lastTime
    • interval 时间内的其他触发事件会被忽略。
使用示例
// 假设我们有一个处理滚动事件的函数
function handleScroll() {console.log('Scroll event detected');
}// 我们希望滚动事件每 1 秒最多触发一次
const throttledScrollHandler = throttle(handleScroll, 1000);window.addEventListener('scroll', throttledScrollHandler);

3. 防抖 vs 节流

比较点防抖(Debounce)节流(Throttle)
定义事件触发后等待一定时间,如果没有再次触发才执行函数。一定时间间隔内只执行一次函数。
适用场景用户停止输入后发送请求、调整窗口大小后执行操作等。限制滚动、鼠标移动、按钮点击的频率。
函数执行频率事件停止触发后的最后一次执行。固定时间间隔内执行一次,不管事件触发多少次。
关键点函数会延迟执行,连续触发时只执行一次。函数会以固定的频率执行,忽略多次触发。

4. 结合防抖与节流

有时候我们需要结合防抖和节流的特点。例如,在输入框中,用户输入时我们可以节流,用户停止输入一段时间后再进行防抖处理。

实现方式可以将防抖和节流的逻辑结合使用,也可以根据场景需求自行优化。

5. 传递参数

日常开发中我们经常需要传递参数,给业务函数进行处理,下面继续上面的示例讲解一下,这个时候该如何传递参数。

使用示例
function debounce(fn, delay) {let timer;return function (...args) {const context = this;clearTimeout(timer);  // 清除之前的定时器timer = setTimeout(() => {fn.apply(context, args);  // 重新设置定时器}, delay);};
}
// 假设我们有一个处理输入框的函数
function handleInput(event) {console.log('Input value:', event.target.value);
}// 我们希望在用户停止输入后的 500ms 执行
const debouncedInputHandler = debounce(function (event) {handleInput(event)
}, 500);document.getElementById('input').addEventListener('input', (event) => debouncedInputHandler(event));

在这里插入图片描述

以上就是对防抖和节流的讲解,以及在项目中的使用,如果还有不明白的欢迎留言!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

超详细超实用!!!AI编程之cursor编写设计模式开闭原则实例(四)

云风网 云风笔记 云风知识库 一、设计模式开闭原则定义 当应用的需求改变时,在不修改软件实体(项目模块、类、接口方法)的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。即软件实体应当对扩展开…

【Linux】nginx连接前端项目

文章目录 一、项目编译1.编译文件2.dist文件 二、Linux nginx配置三、启动nginx 一、项目编译 1.编译文件 2.dist文件 二、Linux nginx配置 在Xshell软件中,点击CtrlAltF进入文件传输找到地址:/usr/local/nginx/html将dist文件传入 找到nginx.conf&…

git add成功后忘记commit的文件丢了?

本文目标:开发人员,在了解git fsck命令用法的条件下,进行git add成功但由于误操作导致丢失的文件找回,达到找回丢失文件的程度。 文章目录 1 痛点2 解决方案3 总结/练习 1 痛点 开发过程中,分支太多(基线分…

CREO教程——2 绘制标准图纸

CREO教程——2 绘制标准图纸 说明:继承第一章设置好的配置文件,这一章进行学习分享如何定制自己的图纸图框,参考国家标准距,定制属于设计师或单位的通用图框。 1.设置工作目录 1.1设置工作目录 1.打开软件设置工作目录&#x…

u盘格式化怎么恢复数据?四款工具来救急!

工作中真的没少碰到过那些让人头疼的数据丢失问题,特别是U盘里的宝贝数据一不小心就“蒸发”了,简直让人欲哭无泪。不过别担心,我作为一个数据恢复的新手小白,最近可是亲测了几款超给力的数据恢复软件,今天就来跟大家分…

19c-TNS-12541: TNS:no listener

有套19c单机,没应用任何的补丁,使用lsnrctl status查看监听是异常的,但是lsnrctl start发现监听已运行,当前业务连接都正常, orcl:/home/oracledb> lsnrctl status LSNRCTL for Linux: Version 19.0.0.0.0 - Pro…

打造灵活DateTimePicker日期时间选择器组件:轻松实现时间的独立清除功能

element ui中日期和时间选择器(DateTimePicker)是一个常见且重要的组件。它允许用户轻松地选择日期和时间,极大地提升了用户体验。然而,在某些场景下,用户可能需要更细粒度的控制,例如单独清除已选择的时间…

下载与安装|Inventor 2025百度云资源分享附教程

如大家所了解的,Inventor是一款专业的三维可视化实体建模软件,主要用于各类二维机械制图、三维制图的设计和开发等操作,可以广泛地应用于零件设计、钣金设计、装配设计等领域。 不同领域的应用证明了Inventor具有强大的兼容性,基…

监控易监测对象及指标之:全面监控Oracle ODBC数据库

在数字化时代,数据库作为存储和管理企业核心数据的基石,其稳定性和性能直接关系到业务的连续性和效率。Oracle数据库以其强大的功能和稳定性,广泛应用于各行各业。为了确保Oracle数据库的稳定运行和高效性能,对其进行全面监控显得…

备战软考Day04-计算机网络

1、计算机网络的分类 2、七层网络体系结构 3、网络的设备与标准 4、TCP/IP协议族 TCP/IP作为Internet的核心协议,被广泛应用于局域网和广域网中,目前已成为事实上的国际标准 1、TCP/IP分层模型 TCP/IP协议是Internet的基础和核心,和OSI参考…

git命令将已经commit的代码push到其他分支

文章目录 一:对于多分支的代码库,将提交记录从一个分支转移到另一个分支是常见需求方法1:撤销commit操作方法2:实用命令git cherry-pick 来移动commit 二、不小心revert导致代码消失的问题 一:对于多分支的代码库&…

【Diffusion分割】FDiff-Fusion:基于模糊学习的去噪扩散融合网络

FDiff-Fusion: Denoising diffusion fusion network based on fuzzy learning for 3D medical image segmentation 摘要: 近年来,去噪扩散模型在图像分割建模中取得了令人瞩目的成就。凭借其强大的非线性建模能力和优越的泛化性能,去噪扩散模…

好用的todolist待办清单软件下载推荐

在快节奏的现代生活中,时间管理变得尤为重要。todolist待办清单管理软件,作为一种高效的任务管理工具,它帮助我们记录、跟踪和管理日常任务,从而提升个人效率。 在众多的待办软件中,敬业签以其出色的用户体验脱颖而出…

Vue2电商项目(四) Detail模块

文章目录 一、配置Detail路由1. 将Detail组件配置为路由组件2. 将路由配置文件拆分3. 声明式导航跳转到Detail跳转时存在的问题:页面滚动条还在下边 二、配置API及vuex三、放大镜及下方轮播图1. Detail组件传递放大镜数据2. 读取vuex数据的经典错误undefined3. 放大…

力扣234 回文链表 Java版本

文章目录 题目描述代码 题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表 。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true 示例 2&…

【集合拆分+多线程并行处理,拿来即用】

文章目录 一.业务场景二.拆分流程三. 简单上个List拆分的demo四.测试结果五.小结 一.业务场景 节假日后第一天,上完班有点累,回到家稍微写点简单的东西。 我们项目里面有这样一业务场景,要计算全公司所有人某几个月内每天的考勤机打卡加班工时…

docker从0到1运行mysql(最详细且绝对成功版)

前置环境 CentOS7.8 安装docker yum install -y docker 启动docker并检查docker状态 systemctl start docker systemctl status docker 这样即正常 设置镜像加速 修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值 vim /etc/docker/daemon.json …

set的使用

序列式容器和关联式容器 序列式容器: 前⾯我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间…

监控和维护 Linux 系统的健康状态:从服务启动故障到操作系统查询

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

启动 Ntopng 服务前需先启动 redis 服务及 Ntopng 常用参数介绍

启动Ntopng服务之前需要先启动redis服务,因为Ntopng服务依赖于redis服务的键值存储。 服务重启 服务启动 Ntopng常用参数: -d 将 Ntopng 进程放入后台执行。默认情况下,Ntop 在前台运行。 -u 指定启动Ntopng执行的用户,默认为…