什么是防抖与节流?应用场景举例

  • 防抖
  • 节流
  • 如何处理防抖与节流
    • 防抖
    • 节流
    • 防抖例子
    • 节流例子
    • Vue + Axios全局接口防抖、节流封装实现
  • 小结

防抖

防抖:触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间

应用场景: 提交按钮、用户注册时候的手机号验证、邮箱验证

假设我们有一个登录按钮,如果用户在短时间内多次点击登录按钮,防抖技术可以防止系统误认为这是多次登录请求,而只将其视作一次有效的登录操作。

节流

节流:高频事件触发,但在n秒内只会执行一次,所以 节流会稀释函数的执行频率

应用场景: window对象的resize、scroll事件 拖拽时候的mousemove 射击游戏中的mousedown、keydown事件 文字输入、自动完成的keyup事件

在窗口调整、页面滚动或者抢购等场景中,我们可能就需要使用节流来控制事件的执行频率,以防止资源的浪费。

更多详细内容,请微信搜索“前端爱好者戳我 查看

如何处理防抖与节流

防抖和节流是两种常见的优化技术,用于防止函数被过度调用。

防抖

对于 防抖 ,可以采用以下方式进行处理:

在函数被触发后,先不立即执行函数,而是设置一个 延迟时间,比如n秒。

如果在延迟时间内再次触发了该函数,则重新计算执行时间。只有在延迟时间内没有再次触发函数,才执行函数。

节流

对于节流,可以采用以下方式进行处理:

同样在函数被触发后,先不立即执行函数,而是设置一个时间间隔,比如每n秒执行一次函数。

这样无论函数被触发的频率有多高,只有每n秒内的第一次触发会被执行。

具体实现防抖和节流的代码,可以参考以下示例代码:

// 防抖
function debounce(fn, delay) {  let timer = null;  return function() {  clearTimeout(timer);  timer = setTimeout(() => {  fn.apply(this, arguments);  }, delay);  };  
}

在防抖函数中,我们首先定义了一个定时器变量 timer。

在函数被触发时,先清除上一次的定时器,然后设置一个新的定时器,延迟指定时间后执行函数 fn。

这样就实现了在一段时间内只执行一次函数的效果。

// 节流
function throttle(fn, delay) {  let timer = null;  return function() {  if (!timer) {  timer = setTimeout(() => {  fn.apply(this, arguments);  timer = null;  }, delay);  }  };  
}

在节流函数中,我们同样定义了一个定时器变量 timer。

在函数被触发时,检查定时器是否已经存在,如果不存在,则设置一个新的定时器,延迟指定时间后执行函数 fn。

这样就实现了在一段时间内只执行一次函数的效果。

防抖例子

对于短时间内频繁点击或输入的事件触发,未使用防抖处理的事件对于用户体验并不是很好。因此我们可以使用防抖进行处理,如下:

<div class="box">进行防抖处理的:<input type="text" id="name" name="name">
</div>
<script>// 模仿一段ajax请求function ajax(value){console.log("ajax request: " + value + ", time: " + new Date());}// 防抖函数function debounce(func,delay){let timeout; //定时器return function(arguments){// 判断定时器是否存在,存在的话进行清除,重新进行定时器计数if(timeout) clearTimeout(timeout);//清除之前的事件timeout = setTimeout(()=>{func.call(this,arguments);//执行事件},delay);}}const inputBox = document.getElementById("name");// 使用防抖函数进行封装ajaxlet debounceAjax = debounce(ajax,500);inputBox.addEventListener("keyup",e=>{debounceAjax(e.target.value);})
</script>

从上面的运行结果可以看出,在500ms内输入文字按下键盘都不会触发请求事件,而是在输入框的定时器500ms停止输入后发送请求。

实现原理很简单,就是对于频繁输入的输入框请求事件添加定时器进行计数,在指定时间内进行频繁输入并不会进行ajax请求,而是在指定时间间隔内停止输入才会执行函数。

当停止输入但在此定时器计数时间内,会重新进行触发请求事件

节流例子

<div class="box">进行节流处理的:<input type="text" id="name" name="name">
</div>
<script>// 模仿一段ajax请求function ajax(value){console.log("ajax request: " + value + ", time: " + new Date());}// 节流--定时器版function throttle(func,delay){let timeout;//定义一个定时器标记return function(arguments){// 判断是否存在定时器if(!timeout){ // 创建一个定时器timeout = setTimeout(()=>{// delay时间间隔清空定时器clearTimeout(timeout);func.call(this,arguments);},delay)}}}const inputBox = document.getElementById("name");// 使用节流函数进行封装ajaxlet throttleAjax = throttle(ajax,500);inputBox.addEventListener("keyup",e=>{throttleAjax(e.target.value);})
</script>

从上面可以看到,无论我们在输入框输入多少文字,在指定时间内只执行一次函数

Vue + Axios全局接口防抖、节流封装实现

import axios from 'axios'function request(config) {const instance = axios.create({baseURL: 'http://localhost:3000/api',timeout: 10000})// 防抖const debounceTokenCancel = new Map()instance.interceptors.request.use(config => {const tokenKey = `${config.method}-${config.url}`const cancel = debounceTokenCancel.get(tokenKey)if (cancel) {cancel()}return new Promise(resolve => {const timer = setTimeout(() => {clearTimeout(timer)resolve(config)}, 800)debounceTokenCancel.set(tokenKey, () => {clearTimeout(timer)resolve(new Error('取消请求'))})})}, error => {console.log(error)return Promise.reject(error)})instance.interceptors.response.use(response => {return response}, error => {console.log(error)return Promise.reject(error)})// 节流let lastTime = new Date().getTime()instance.interceptors.request.use(config => {const nowTime = new Date().getTime()if (nowTime - lastTime < 1000) {return Promise.reject(new Error('节流处理中,稍后再试'))}lastTime = nowTimereturn config}, error => {console.log(error)return Promise.reject(error)})return instance(config)
}export default request

小结

  • 函数防抖和函数节流都是防止某一时间内频繁触发。
  • 函数防抖是在指定时间只执行一次,而函数节流是每到指定间隔时间执行一次。
  • 函数防抖是将几次操作合并为一此操作进行,函数节流使得一定时间内只触发一次函数。

参考链接

  • https://blog.csdn.net/qq_40716795/article/details/123144385
  • https://juejin.cn/post/7225133152490160187

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

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

相关文章

QEMU源码全解析 —— virtio(2)

接前一篇文章&#xff1a; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; 上一回对于virtio进行了简介&#xff0c;并说明了其基本原理以及框架。对…

【JVM入门到实战】(三) 查看字节码文件的工具

一、 javap -v命令 javap是JDK自带的反编译工具&#xff0c;可以通过控制台查看字节码文件的内容。适合在服务器上查看字节码文件内容。直接输入javap查看所有参数。输入javap -v 字节码文件名称 查看具体的字节码信息。&#xff08;如果jar包需要先使用 jar –xvf 命令解压&a…

mmyolo的bbox_loss和检测bbox都是空

最近用mmyolo训练自己的数据集的时候发现训练的时候loss_bbox0&#xff0c;测试和eval的时候结果也全是空的&#xff0c;排除了数据集读取的问题&#xff0c;最后发现是config中自定义了自己的类别但是没有传给dataset。。。 简而言之&#xff0c;在自定义了数据集里的metainf…

深入理解Java虚拟机---内存分配

深入理解Java虚拟机---内存分配 GC日志内存分配与回收策略对象优先在Eden分配大对象直接进入老年代长期存活的对象将进入老年代动态对象年龄判定空间分配担保 GC日志 以下两段典型的GC日志&#xff1a; 33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 secs] 3324K-&…

【C语言】一个RDMACM、Verbs API与epoll一起使用的例子

一、epoll介绍 epoll是Linux内核为处理大批量文件描述符而作了改进的poll&#xff0c;是Linux下多路复用IO接口select/poll的增强版本&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。 以下是epoll的主要使用方法和优点&#xff1a; epo…

2023-12-05 Qt学习总结10

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言二十六 学生信息管理系统插入介绍: QTableView和QSqlTableModelQTableViewQSqlTableModel 程序所用数据库表格程序组成以及界面学生端源码:管理员端源码: 总结 前言 要解决问题: 学习qt最核心知识, 多一个都不…

Android : BottomNavigation底部导航_简单应用

示例图&#xff1a; 1.先创建底部导航需要的图片 res → New → Vector Asset 创建三个矢量图 图片1 baseline_home.xml <vector android:height"24dp" android:tint"#000000"android:viewportHeight"24" android:viewportWidth"24…

GEE机器学习——利用支持向量机SVM进行土地分类和精度评定

支持向量机方法 支持向量机(Support Vector Machine,SVM)是一种常用的机器学习算法,主要用于分类和回归问题。SVM的目标是找到一个最优的超平面,将不同类别的样本点分隔开来,使得两个类别的间隔最大化。具体来说,SVM通过寻找支持向量(即距离超平面最近的样本点),确定…

代码随想录 416. 分割等和子集

题目 使用二维dp数组思路 首先&#xff0c;我们需要计算整个数组的元素和 total_sum。如果 total_sum 是奇数&#xff0c;那么无论如何都无法将数组分成两个和相等的子集&#xff0c;因此直接返回 false。 然后&#xff0c;我们定义一个二维布尔数组 dp&#xff0c;其中 dp[i]…

nrm 的使用 可以快速切换下载(npm)镜像,解决资源下载慢和运行失败

nrm是什么&#xff1f; 介绍 nrm(npm registry manager) 是 npm 的镜像源管理工具. 有时候国外资源太慢,使用 nrm 可以快速的在 npm 源之间切换 安装 npm install -g nrm 基本使用 查看可选择的源 nrm ls 切换到对应的镜像源 nrm use 对应的镜像 删除镜像源 nrm del 名字 …

ArrayDeque阅读记录

前言&#xff1a; 1.对Queue接口进行实现 2.底层的数据结构还是数组&#xff0c;同时还是双向的&#xff0c;有前后指针 3.不是线程安全的 4.可以当作队列和栈来使用&#xff0c;选择使用队列时&#xff0c;ArrayDeque推荐首选 5.不可以添加null数据&#xff0c;会抛异常 …

深入理解 SVG:开启向量图形的大门(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

SQL注入漏洞的漏洞挖掘与利用

预计更新SQL注入概述 1.1 SQL注入攻击概述 1.2 SQL注入漏洞分类 1.3 SQL注入攻击的危害 SQLMap介绍 2.1 SQLMap简介 2.2 SQLMap安装与配置 2.3 SQLMap基本用法 SQLMap进阶使用 3.1 SQLMap高级用法 3.2 SQLMap配置文件详解 3.3 SQLMap插件的使用 SQL注入漏洞检测 4.1 SQL注入…

acwing算法提高之动态规划--背包模型(四)

目录 1 基础知识2 模板3 工程化 1 基础知识 暂无。。。 2 模板 暂无。。。 3 工程化 题目1&#xff1a;货币系统。 解题思路&#xff1a;完全背包模型求方案数。 状态定义f[i][j]&#xff1a;从前i个物品中选体积恰好为j的方案数。 状态转移f[i][j]&#xff0c;以下情况…

ArcGIS pro与SuperMap根据属性自动填充颜色步骤

GIS项目经常会接触到控规CAD数据&#xff0c;想要把数据转换成GIS图层并发布&#xff0c;需要进行专题配图。研究了一下ArcGIS pro和SuperMap iDesktop的配图&#xff0c;整理一下用到的一些技术思路。 1、Excel表格根据RGB值添加单元格填充颜色 要实现如上效果图&#xff0c;…

【C语言程序设计】循环结构程序设计

目录 前言 一、程序设计第一题 二、程序设计第二题 三、程序设计第三题 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da…

Ubuntu 22.04 安装 OCI CLI

Ubuntu 22.04 安装 OCI CLI 安装命令 安装命令 wget https://codeload.github.com/oracle/oci-cli/zip/master -O oci-cli.zip pip install oci-cli.zip完结&#xff01;

Armv8/Armv9从入门到精通-课程介绍

通知&#xff0c;Arm二期&#xff0c;咱们也有大合集PDF了&#xff0c;共计1587页&#xff0c;还未完成&#xff0c;后续持续更新和优化中。为了方便大家阅读、探讨、做笔记&#xff0c;特意整了此合集PPT&#xff0c;为了增加标签目录&#xff0c;还特意开了福兮阅读器会员。 …

宇视科技视频监控 main-cgi 文件信息泄露漏洞

宇视科技视频监控 main-cgi 文件信息泄露漏洞 一、产品简介二、漏概述三、复现环境四、漏洞检测手工抓包自动化检测 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#…

java实现局域网内视频投屏播放(一)背景/需求

一 背景 我们在用电视上投屏电影或者电视剧时&#xff0c;如果没有vip&#xff0c;用盗版电影网站投屏的话会有两个问题&#xff0c;1:他们网站没有投屏功能。2:卡&#xff01;&#xff01;&#xff01;。还有就是不能随心所欲的设置自己先要自动播放的视频列表&#xff08;如…