js关于防抖和节流的问题

目录

一、防抖

1、防抖代码编写

2、添加一个是否立即执行的参数flag

3、防抖应用场景

 二、节流

1、节流函数编写

时间戳

定时器

时间戳 + 定时器。

2、节流场景

scroll 滚动

input 动态搜索

三、总结

四、防抖的库


防抖和节流的话题,无论是在面试还是在实际场景的应用过程中都,是一个出现频率很高的话题。本文就这两个话题,做一个全面的梳理。 

一、防抖

  • 防抖: n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时

这句话的意思是:防抖就是要延迟执行,你一直操作触发事件一直不执行,当你停止操作等待多少秒后才执行。也就是说不管事件触发频率有多高,一定在事件触发 n 秒后执行。如果在事件触发的 n 秒又触发了这个事件,那就以新事件的事件为准,n 秒后才执行。总之,要等你触发完事件 n 秒内不再触发事件,它才执行。

1、防抖代码编写

根据定义,我们知道要在时间 n 秒后执行,那么我们就用定时器来实现:

function debounce(event, wait) {let timer = null;return function (...args) {clearTimeout(timer); // 清除setTimeout,使其回调函数不执行timer = setTimeout(() => {event.apply(this, args)}, wait)}
}

2、添加一个是否立即执行的参数flag

代码很简单,即当还在触发事件时,就清除 timer,使其在 n 秒后执行,但此写法首次不会立即执行,为其健壮性,需加上判断是否第一次执行的第三个参数 flag,判断其是否立即执行。

function debounce(event, wait, flag) {let timer = null;return function (...args) {clearTimeout(timer)if (!timer && flag) {event.apply(this, args)} else {timer = setTimeout(() => {event.apply(this, args)}, wait)}}
}

3、防抖应用场景

窗口大小变化,调整样式

window.addEventListener('resize', debounce(handleResize, 200))

搜索框,输入后1000毫秒搜索

debounce(fetchSelectData, 300)

表单验证,输入 1000 毫秒后验证

debounce(validator, 1000)

其他诸如,登录、点击按钮提交表单、点赞、收藏、标心… 等等。

 二、节流

  • 节流: n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效

 顾名思义,一节一节的流,就好似控制水阀,在事件不断触发的过程中,固定时间内执行一次事件。

1、节流函数编写

因为是固定时间内执行一次时间,所以我们有两种实现方法,一用时间戳,二用定时器。

时间戳
function throttle(event, wait) {let pre = 0;return function (...args){if (new Date() - pre > wait) {// 当 n 秒内不重复执行pre = new Date();event.apply(this, args)}} 
}

使用时间戳虽然能实现节流,但是最后一次事件不会执行。

定时器
function throttle(event, wait) {let timer = null;return function (...args) {if (!timer) {timer = setTimeout(() => {timer = null;event.apply(this, args)}, wait)   }}
}

使用定时器实现节流,虽然最后一次能触发,但是第一次不会触发。

时间戳 + 定时器。

为解决第一次和最后一次都可以触发,把两者结合起来。

function throttle(event, wait) {let pre = 0, timer = null;return function (...args) {if (new Date() - pre > wait) {clearTimeout(timer);timer = null;pre = new Date();event.apply(this, args)} else {timer = setTimeout(() => {event.apply(this, args)}, wait)}}
}

2、节流场景

scroll 滚动
window.addEventListener('scroll', throttle(handleScroll, 200))
input 动态搜索
throttle(fetchInput, 300)

三、总结

防抖:只执行最后一次。事件持续触发,但只有等事件停止触发后 n 秒后才执行函数。

节流:控制执行频率。持续触发,每 n 秒执行一次函数。

四、防抖的库

两大工具库都有防抖源码,可供参考:

  • debounce.lodash(这个库比较新一点)

  •  un-debounce

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

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

相关文章

【网站项目】014乡镇自来水收费系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Java的控制流语句详解

Java的控制流语句详解 文章目录 Java的控制流语句详解前言一、顺序结构二、选择结构1. if语句:用于判断一个条件是否为真,如果为真则执行相应的代码块。2. if...else if...else语句:用于在条件为真时执行一段代码,否则执行另一段代…

在Dart中,读取文件有两种常见的方式:使用 Stream 和使用 Future

使用 Stream 读取文件&#xff1a; import dart:io;void main() {Stream<List<int>> stream File("example.txt").openRead();stream.listen((List<int> event) {// 处理文件内容print(event);}); }异步处理&#xff1a; Stream 适用于处理大文件…

Qualcomm AI Hub-API介绍

Qualcomm AI Hub极大的简化了AI 模型部署到边缘设备的过程。本文主要介绍了Qualcomm AI Hub使用的各种API接口&#xff0c;还有各个模型配置的参数数据&#xff0c;具体可以参考API documentation API介绍&#xff1a; Core API API的核心功能&#xff0c;可直接通过qai_hub获…

代码随想录算法训练营第55天| Leetcode 583. 两个字符串的删除操作、Leetcode 72. 编辑距离

文章目录 Leetcode 583. 两个字符串的删除操作Leetcode 72. 编辑距离 Leetcode 583. 两个字符串的删除操作 题目链接&#xff1a;Leetcode 583. 两个字符串的删除操作 题目描述&#xff1a; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步…

Linux命令:wget命令

1 wget命令 1.1 简介 wget命令是一种常用的网络工具&#xff0c;用于从Web服务器下载文件。 wget命令基于HTTP、HTTPS和FTP协议从指定的URL下载文件。它可以在Linux和Unix系统的命令行中使用&#xff0c;并支持各种参数来定制下载行为。Wget也可以根据HTML、XHTML和CSS页面中…

JavaScript---lazyload图片懒加载处理_IntersectionObserver

IntersectionObserver API兼容性&#xff1a; 部分代码展示&#xff1a; // 懒加载处理const imgsElem document.querySelectorAll(img);const topElem document.querySelector(#top);// IntersectionObserverconst Observer new IntersectionObserver((entries, observer) …

Redis 大key和热key问题及处理

一、说说什么是Redis、及特点&#xff1f; Redis是一个基于内存存储数据运行并支持持久化、使用key/value形式存储的高性能的nosql数据库&#xff0c;适合用于存储频繁访问&#xff0c;数据量较小的场景下。 特点&#xff1a; 支持数据持久化&#xff1a;可以将内存中的数据保…

STL(C++)

STL&#xff1a;标准模板库&#xff0c;它提供了一系列实现了常见数据结构和算法的模板类和函数。 STL的六大组件 容器 用于存放数据 std::string&#xff1a;字符串类&#xff0c;类比容器 std::vector&#xff1a;单端动态数组。支持随机访问&#xff0c;适合频繁访问元素…

PWARL CTF and others

title: 一些复杂点的题目 date: 2024-03-09 16:05:24 tags: CTF 2024年3月9日 今日习题完成&#xff1a; 1.BUU [网鼎杯 2020 半决赛]AliceWebsite 2.[RoarCTF 2019]Online Proxy 3.[Polar CTF]到底给不给flag呢 4.网鼎杯 2020 总决赛]Game Exp [RoarCTF 2019]Online Proxy …

Java设计模式之代理模式

代理模式是 Java 中常用的设计模式之一&#xff0c;它通过引入一个代理对象来控制对实际对象的访问&#xff0c;从而实现对目标对象的间接访问和控制。代理模式可以用于多种场景&#xff0c;比如权限控制、延迟加载、日志记录等。 在 Java 中&#xff0c;代理模式通常分为静态…

【软件工程导论】——软工学绪论及传统软件工程(学习笔记)

&#x1f4d6; 前言&#xff1a;随着软件产业的发展&#xff0c;计算机应用逐步渗透到社会生活的各个角落&#xff0c;使各行各业都发生了很大的变化。这同时也促使人们对软件的品种、数量、功能和质量等提出了越来越高的要求。然而&#xff0c;软件的规模越大、越复杂&#xf…

X64 页表结构

PML4&#xff08;Page Map Level 4&#xff09;是x86-64架构中用于管理虚拟内存地址翻译的四级页表结构之一。它是一种树形结构&#xff0c;由多个页目录表&#xff08;Page Directory Pointer Table&#xff0c;PDPT&#xff09;组成&#xff0c;每个PDPT有512个指向下一级页表…

Hololens 2应用开发系列(3)——MRTK基础知识及配置文件配置(中)

Hololens 2应用开发系列&#xff08;3&#xff09;——MRTK基础知识及配置文件配置&#xff08;中&#xff09; 一、前言二、输入系统2.1 MRTK输入系统介绍2.2 输入数据提供者&#xff08;Input Data Providers&#xff09;2.3 输入动作&#xff08;Input Actions&#xff09;2…

Date类型及dayjs的使用总结

一、Date() Date数据类型用于处理日期和时间&#xff0c;它可以表示自1970年1月1日00:00:00 UTC&#xff08;Coordinated Universal Time&#xff0c;国际协调时间&#xff09;以来的毫秒数。 1.创建Date对象 例如&#xff1a;Tue Oct 31 2023 14:01:33 GMT0800 (中国标准时…

算法刷题day28

目录 引言一、截断数组二、双端队列三、日期统计 引言 这几道题是周赛里的几道题目&#xff0c;第一道题目我没用这种方法&#xff0c;但还是做出来了&#xff0c;用的一种比较特殊的思考方法&#xff0c;就是把每一个点都判断出来&#xff0c;不满足要求的就舍弃&#xff0c;…

【你也能从零基础学会网站开发】Web建站之javascript入门篇 JavaScript事件处理

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 什么是DHTML …

Linux基础命令[16]-head

文章目录 1. head 命令说明2. head 命令语法3. head 命令示例3.1 不加参数3.2 -c&#xff08;按照字节显示&#xff09;3.3 -n&#xff08;按照行数显示&#xff09;3.4 -v&#xff08;显示文件名&#xff09; 4. 总结 1. head 命令说明 head&#xff1a;用来显示文件开头&…

Linux认识与学习BASH

Linux认识与学习BASH 认识BASH这个Shellshell是什么系统的合法shell与/etc/shells功能Bash Shell的功能查询命令是否为Bash shell 的内置命令(type)命令的执行与快速编辑按钮 shell的变量功能什么是变量&#xff1f;变量的使用与设置&#xff1a;echo、变量设置规则、unset环境…

springboot网页时装购物系统链接

链接:https://pan.baidu.com/s/1mCmCSbqUCv48_a6wiLBdJg?pwdfalz 提取码:falz 2600套项目源码 https://kdocs.cn/l/cuAdxEBfLiqA 工作室精心制作&#xff0c;包括小程序项目&#xff0c;springboot项目&#xff0c;传统ssm项目&#xff0c;前后端分离项目。你可以用来制作自…