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

news2024/9/24 20:15:10

防抖(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.coloradmin.cn/o/2161321.html

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

相关文章

想把泰文从文本上识别,什么软件工具好用呢?

泰文识别技术涉及将泰文图像转换成数字文本,主要通过光学字符识别(OCR)技术实现。这项技术广泛应用于文档处理、语言学习和翻译服务。实现泰文识别的方法包括使用手机应用程序、在线服务、专业软件,以及结合人工智能和机器学习。此…

UE5 C++: 插件编写04 | 自动增加前缀

准备工作 UObject* Asset UObject* Asset 通常指的是一个指向UObject的指针。UObject是Unreal Engine中的基类,几乎所有的引擎对象都继承自UObject。这个指针可以引用任何派生自UObject的对象,比如蓝图、材质、贴图、音频资源等资产。 如果你看到UObj…

【C++】——set和map的使用

文章目录 set的特性set初始化set迭代器和常见成员函数multisetmap的特性map初始化map迭代器和常见成员函数insert[]运算符重载multimap set的特性 自动排序: set中的元素会默认排升序存储唯一性: set中每个元素都是唯一的,如果插入一个已有元…

如何找到实力突出的建站公司,2024网络建站公司推荐

选择网站建设公司需要考虑公司以下几点: 是否对的业务需求的了解程度如何? 与公司的文化契合度 相同企业文化的公司,往往能取得很好的合作 沟通的方式 考虑:谁将是解决疑虑、查询、反馈的联系人,查询的响应时间是…

ShiroFilterFactoryBean登录认证成功后没有正常跳转到successUrl问题解决

问题出现: 分析:在配置了ShiroFilter之后,直接尝试在页面端访问login.jsp,但是login.jsp需要做认证过滤也就是FormAuthenticationFilter。 应为没有登录信息所以可想而知,会走ShiroFilterFactoryBean定义的loginUrl也就是认定为没…

VBA技术资料MF202:添加右键多按钮弹出菜单

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

使用PLSQL Developer快速连接数据库

文章目录 前言一、定义设置方式二、固定用户设置方式三、连接设置方式总结前言 PLSQL Developer是一个集成开发环境,由Allround Automations公司开发,专门面向Oracle数据库存储的程序单元的开发。该工具提供了多种设置方式,便于使用者在不需要输入用户名称、密码的情况下,…

易航网址导航系统V2.45完美去授权版

简介 易航网址导航系统V2.45完美去授权版 界面

2024 年 CSS 终于增加了垂直居中特性,效率翻倍!

在 2024 年的Chrome 123 版本中&#xff0c; CSS 原生可以使用 1 个 CSS 属性 align-content: center进行垂直居中。 有何魅力&#xff1f; 这个特性的魅力在哪儿呢&#xff1f;我举例给你看一下 <div style"align-content:center; height:200px; background: #614e…

18722 稀疏矩阵的运算

思路&#xff1a; 快速转置算法的基本思想是预先计算出转置后的三元组在新数组中的位置&#xff0c;然后直接将元素放到对应的位置上。这样做的好处是只需要遍历一次原数组&#xff0c;就可以完成转置操作。 步骤如下&#xff1a; 1. 初始化一个新的三元组数组&#xff0c;用于…

数据库性能监控如何做?简单3步实现慢SQL、长事务监控!

1.背景说明 对于使用关系型数据库的系统而言&#xff0c;在系统投产上线后&#xff0c;及时发现程序运行中的慢SQL语句&#xff0c;能有效降低系统运行风险&#xff1b;对于分布式应用系统来说&#xff0c;在系统日常运行中&#xff0c;为避免因数据库长事务导致主备切换风险&…

2024年 AI大模型我该买一张什么卡?

有钱啥也不用说&#xff0c;买张最贵的就是了。对囊中羞涩的我还说&#xff0c;我该买张什么样的显卡呢&#xff1f; 我的旧显卡RTX1060 6G&#xff0c;满负荷消耗功率110多瓦&#xff0c;几乎达到设计最大TDP&#xff0c;周日时拿了朋友的RTX3060Ti 8G&#xff0c;发现是锁算…

免费与付费代理IP工具的优缺点分析

面对市场上众多的代理IP工具&#xff0c;选择合适的工具成为一项挑战。本文将深入分析免费与付费代理IP工具的优缺点&#xff0c;协助您做出明智的选择。 一、免费代理IP工具的优缺点 优点&#xff1a; 零成本&#xff1a;最大的优点在于无需任何费用。对于预算有限的用户&a…

【资源一号02C卫星】

资源一号02C卫星 资源一号02C卫星是中国航天科技集团公司所属中国空间技术研究院负责研制生产的一颗重要遥感卫星。以下是关于该卫星的详细介绍&#xff1a; 一、基本信息 发射时间&#xff1a;2011年12月22日11时26分发射地点&#xff1a;中国太原卫星发射中心运载火箭&am…

加载数据模型:在数据采集中实现动态数据处理

介绍 在现代网络爬虫技术中&#xff0c;数据的动态处理成为了提升采集效率和准确性的重要手段。随着目标网站数据的多样性和复杂性增加&#xff0c;静态数据采集方法逐渐无法满足需求。本文以拼多多为例&#xff0c;探讨如何通过加载数据模型实现动态数据处理&#xff0c;并结…

【大模型-驯化】成功搞懂大模型的jsonl数据格式处理和写入,通过pandas读取和保存JSONL文件

【大模型-驯化】成功搞懂大模型的jsonl数据格式处理和写入&#xff0c;通过pandas读取和保存JSONL文件 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &…

文件上传-php

查找方式 ***(1) 黑盒 查找(upload) 扫描 (2) 应用型 窗口 上传中心或者后台中心 上传 Ps:后台是后台 权限是权限 (3) 会员中心 (4) 白盒 基本函数定义 写前端的 Enctype 上传类型Method 提交方式Onsubmit 鼠标的时间Action"放在指定文件"Php 接受表单数据 isset(…

简单计算器(python基础代码撰写)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

Java反射机制入门:解锁运行时类信息的秘密

反射技术&#xff1a; 其实就是对类进行解剖的技术 类中有什么&#xff1f;构造方法 成员方法成员变量 结论&#xff1a;反射技术就是把一个类进行了解剖&#xff0c;然后获取到 构造方法、成员变量、成员方法 反射技术的应用案例&#xff1a; idea框架技术&#xff1a;Spr…

【VMware】虚拟机安装

文章目录 一、安装二、登录配IP1.登录成功后&#xff1a;2.设置DNS地址3.重启网络服务 一、安装 1.tools文件中&#xff0c;准备VMware软件&#xff0c;与CentOS7.4安装包 详情操作 2. VMware软件安装成功后查看网络连接&#xff0c;出现新的以太网&#xff0c;Vmnet1&#xf…