位置: IT常识 - 正文

防抖、节流的介绍(防抖节流实现原理)

编辑:rootadmin
防抖、节流的介绍

目录

一、什么时候要用到防抖节流

输入框连续输入的案例

滚动条案例

 二、什么是防抖、节流

  使用防抖来解决输入框案例造成的浪费现象: 

使用节流来解决滚动条案例造成的浪费现象: 

三、总结


一、什么时候要用到防抖节流

推荐整理分享防抖、节流的介绍(防抖节流实现原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:防抖和节流的作用,防抖、节流,节流防抖 js,防抖和节流用在什么地方,防抖节流的区别和使用场景,防抖和节流用在什么地方,防抖,节流的介质有哪些,防抖、节流,内容如对您有帮助,希望把文章链接给更多的朋友!

        针一类类快速连续触发和不可控的高频触发问题,可以用节流和防抖。如通过滚动条的滚动来发起请求、通过输入文字来发起请求这一类的行为,下面用两个例子具体的给大家展示。

输入框连续输入的案例<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title></head><body> <div> <span>输入文字发起请求:</span> <input type="text" id="input"> </div> <script> // 通过id选择器获取到输入框实例对象 const input = document.getElementById('input') // 给输入框对象绑定键盘输入事件 input.oninput = function () { //利用定时器来模拟异步操作 setTimeout(() => { // 使用日志输出来模拟ajax请求 console.log("发起ajax请求" + ",时间戳为:" + new Date()); }, 1000) } </script></body></html>

        通过运行的结果我们可以发现,输入123456,我们的请求也发送了6次。但实际上,我们并不关注输入1-5这5个字的结果,我们需要的是输入6之后的请求结果,那么前5次的请求都是无效的。如果请求需要的代价很大,就会造成较大的资源、带宽浪费甚至网页卡顿。对此我们就需要使用防抖的技术来解决这个问题。

滚动条案例<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .outer { height: 300px; } .inner { height: 1000px; /* 使用overflow:auto来开启滚动条 */ overflow: auto; } </style></head><body> <div class="outer"> <div class="inner"></div> </div> <script> window.onscroll = function () { //利用定时器来模拟异步操作 setTimeout(() => { // 使用日志输出来模拟ajax请求 console.log("发起ajax请求"); }, 1000) } </script></body></html>

        这里将滚轮从最高处滑动到最后,可以发现请求发送了41条,同样的我们关注的是最后一条的请求结果,因此也造成了大量的资源浪费,这种情况下就可以使用节流来进行操作。

        又或者大家经常用到的京东,我们通过鼠标悬浮在左侧的菜单项上,动态的渲染右侧显示的内容。也是可以使用到节流,因为我们关注的只是我最后鼠标放置位置展示右侧的内容,使用节流可以节省一定的网络资源。

 二、什么是防抖、节流

        (学习防抖和节流需要有闭包的知识基础)

 防抖,顾名思义,防止抖动。用于将用户的操作行为触发转换为程序行为触发,防止用户操作的结果抖动。一段时间内,事件在我们规定的间隔 n 秒内多次执行,回调只会执行一次。  使用防抖来解决输入框案例造成的浪费现象: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title></head><body> <div> <span>输入文字发起请求:</span> <input type="text" id="input"> </div> <script> // 通过id选择器获取到输入框实例对象 const input = document.getElementById('input') /* 防抖函数 */ let debounce = function (callback, delay) { // 使用闭包的外部变量来定义定时器 let timer; return function () { // 判断是否已经存在定时任务 if (timer) { /* 如果已有定时任务就将已有任务清楚, 再重新生成新的定时任务 */ clearTimeout(timer) } // 生成定时任务并赋值给timer timer = setTimeout(() => { callback.call(this) }, delay) } } let ajax = function () { //利用定时器来模拟异步操作 setTimeout(() => { // 使用日志输出来模拟ajax请求 console.log("发起ajax请求" + ",时间戳为:" + new Date()); }, 1000) } // 给输入框对象绑定键盘输入事件 input.oninput = debounce(ajax, 1000) </script></body></html>防抖、节流的介绍(防抖节流实现原理)

        流程:第一次输入的时候生成一个定时器,当到时间时发送请求。但在这个时间内如果用户再次输入文字的时候,将前一个定时器消除,重新生成一个新的定时器用新的参数发起请求,直到用户不再输入,定时任务完成将最后一次的请求发送给后端,获取到我们最终需要的数据。

        在下图里我们可以看到和最开始的案例已经有了不一样的结果,我们输入了6个字母最后只发送了一次的请求,恰巧是我们所需要的最后一次输入的结果。

 节流,顾名思义,控制流量。用于用户在与页面交互时控制事件发生的频率,一般场景是单位的时间或其它间隔内定时执行操作。一段时间内,事件在每次到达我们规定的间隔 n 秒时触发一次。使用节流来解决滚动条案例造成的浪费现象: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .outer { height: 300px; } .inner { height: 1000px; /* 使用overflow:auto来开启滚动条 */ overflow: auto; } </style></head><body> <div class="outer"> <div class="inner"></div> </div> <script> /* 通过判断flag来实现节流 */ let throttle = function (callback, delay) { // 判断依据 let flag = true return function () { // 如果flag为false便忽略这次操作 if (flag) { /* 设定定时器,当任务执行时将flag恢复false, 允许下一次的事件触发 */ setTimeout(() => { callback.call(this) flag = true }, delay) } //在定时任务执行之前,flag始终为false flag = false } } /* 通过时间来判断 */ let throttling = function (callback, delay) { // 设置一个记录的时间,用以判断是否忽略操作 let time = 0; return function () { // 创建当前时间,用以判断是否超过设定好的延迟 let now = new Date() // 如果两次事件触发时间差大于设定好的毫秒数,则触发新的请求 if (now - time > delay) { // 执行回调函数 callback.call(this) // 将记录的时间设置为这一次执行任务的时间 time = now } } } let ajax = function () { //利用定时器来模拟异步操作 setTimeout(() => { // 使用日志输出来模拟ajax请求 console.log("发起ajax请求"); }, 1000) } window.onscroll = throttling(ajax, 3000) </script></body></html>

流程:设定一个时间,当到达规定时间后执行回调函数。在这个时间里,另外的事件触发则不生效。直到事件触发的时间差大于设定好的延迟时间。

 将页面滑到底部,可以看到只执行了一次。

三、总结

        防抖的使用场景:

mousemove 鼠标滑动事件input 输入事件

        节流的使用场景:

商品搜索列表、商品橱窗等用户滑动时 定时 / 定滑动的高度 发送请求 

        防抖和节流之间的差别:

        防抖可能用于无法预知的用户主动行为,如用户输入内容去服务端动态搜索结果。用户打字的速度等是无法预知的,具有非规律性。

        节流可能用于一些非用户主动行为或者可预知的用户主动行为,如用户滑动商品橱窗时发送埋点请求、滑动固定的高度是已知的逻辑,具有规律性。

        防抖是关注于最后一次的事件触发,而节流则是在规定的时间里只执行一次。

本文链接地址:https://www.jiuchutong.com/zhishi/300777.html 转载请保留说明!

上一篇:电脑找不到应用程序怎么解决? win11explorer.exe找不到应用程序解决办法(电脑找不到应用程序的图标怎么删除)

下一篇:ChatGPT的N种用法(持续更新中。。。)(chat的用法及短语)

  • 湖南健康码怎么删除家庭成员(湖南健康码怎么查询)

    湖南健康码怎么删除家庭成员(湖南健康码怎么查询)

  • 微信可以批量删除聊天记录吗(微信可以批量删除朋友圈吗)

    微信可以批量删除聊天记录吗(微信可以批量删除朋友圈吗)

  • 饿了么可以用微信支付吗(饿了么可以用微信亲属卡吗)

    饿了么可以用微信支付吗(饿了么可以用微信亲属卡吗)

  • 微信怎么拉黑别人(微信怎么拉黑别人苹果手机)

    微信怎么拉黑别人(微信怎么拉黑别人苹果手机)

  • 苹果11拍照正方形怎么设置(苹果拍照正方形在哪里设置)

    苹果11拍照正方形怎么设置(苹果拍照正方形在哪里设置)

  • 华为屏幕按键怎么设置(华为屏幕按键怎么换)

    华为屏幕按键怎么设置(华为屏幕按键怎么换)

  • ps动图必须一帧一帧修吗(ps动图流畅)

    ps动图必须一帧一帧修吗(ps动图流畅)

  • 清除单元格内容按什么键(清除单元格内容快捷键是什么)

    清除单元格内容按什么键(清除单元格内容快捷键是什么)

  • win10自带播放器叫什么(win10自带播放器怎么打开)

    win10自带播放器叫什么(win10自带播放器怎么打开)

  • p30屏幕是oled还是lcd屏幕(华为p30屏幕是oled)

    p30屏幕是oled还是lcd屏幕(华为p30屏幕是oled)

  • 微信群里的群待办在哪里找(微信群里的群待办怎么完成)

    微信群里的群待办在哪里找(微信群里的群待办怎么完成)

  • 附近的人发送成功却没回应(附近的人发送成功别人收不到)

    附近的人发送成功却没回应(附近的人发送成功别人收不到)

  • 联通宽带651错误代码是什么意思(联通宽带651错误怎么办)

    联通宽带651错误代码是什么意思(联通宽带651错误怎么办)

  • 淘淘联盟上选的商品上不了淘宝货架(淘淘联盟抢单是真的吗)

    淘淘联盟上选的商品上不了淘宝货架(淘淘联盟抢单是真的吗)

  • 小米自动亮度调节失效(小米自动亮度调节失效怎么办)

    小米自动亮度调节失效(小米自动亮度调节失效怎么办)

  • 华为nova5支持防水吗(华为nova5防窥膜都不能指纹吗)

    华为nova5支持防水吗(华为nova5防窥膜都不能指纹吗)

  • 克隆mac地址是什么(mac地址克隆将在30秒内生效)

    克隆mac地址是什么(mac地址克隆将在30秒内生效)

  • 4g旁边有个hd什么意思(4g边上有个hd是什么意思)

    4g旁边有个hd什么意思(4g边上有个hd是什么意思)

  • 路由器放电视机旁受干扰吗(路由器放电视机上面有没有影响)

    路由器放电视机旁受干扰吗(路由器放电视机上面有没有影响)

  • iphonex相机ar怎么开(苹果ar照相)

    iphonex相机ar怎么开(苹果ar照相)

  • 抖音热门列表为空怎么解决(抖音热门列表为空卸载重装也没用)

    抖音热门列表为空怎么解决(抖音热门列表为空卸载重装也没用)

  • 手机纳米镀膜怎么去除(手机纳米镀膜怎么就知道镀上没有)

    手机纳米镀膜怎么去除(手机纳米镀膜怎么就知道镀上没有)

  • 拼多多商家怎么设置拼单(拼多多商家怎么维护自己的权益)

    拼多多商家怎么设置拼单(拼多多商家怎么维护自己的权益)

  • ftp无法与服务器建立连接(ftp无法与服务器建立连接win10)

    ftp无法与服务器建立连接(ftp无法与服务器建立连接win10)

  • 微信开通的腾讯视频会员怎么共享(微信开通的腾讯会员怎么让第二个人登录)

    微信开通的腾讯视频会员怎么共享(微信开通的腾讯会员怎么让第二个人登录)

  • QQ被永久封停如何办(qq被永久封停如何注销)

    QQ被永久封停如何办(qq被永久封停如何注销)

  • 5g时代的商机 我们该如何把握(5g商机对于平民百姓)

    5g时代的商机 我们该如何把握(5g商机对于平民百姓)

  • 带息负债融资成本率意义
  • 留抵税额退税怎么做账
  • 金税盘技术维护费
  • 未交增值税借方表示什么
  • 资产负债表中未交税金负数表示什么
  • 股东将投资款转入个人账户
  • 计提固定资产折旧时可以先不考虑固定资产残值的方法是
  • 土地所有权可以出资吗
  • 股本与注册资本实收资本的区别
  • 开票系统年费怎么缴纳
  • 支付给客户的货款叫什么
  • 特殊销售方式下销售额的确定
  • 小规模纳税人怎么算税
  • 进项发票可以抵扣吗
  • 生活垃圾处理项目基础金融产品包括
  • 佣金发票可以抵扣吗
  • 进口增值税内销可以抵扣吗
  • 开票的时候开票人是管理员
  • 资产处置损失减少的原因
  • 公司解散实收资本退还怎么写
  • 外籍人士可以回国吗
  • 融资租入固定资产计提折旧吗
  • 打方向咯噔一声已解决
  • 王者荣耀露娜的故事
  • 什么叫资金预算
  • 冲未开票收入怎么做分录
  • mac屏幕共享要打开什么权限
  • 借条复印件可以起诉吗还有转账记录
  • 行政单位如何将资产年报导入财报里
  • win10怎么清理剪切板
  • 汇算清缴审计报告收费标准
  • PHP:pg_fetch_all_columns()的用法_PostgreSQL函数
  • 报销员工餐费属于哪个科目
  • php中session和cookie
  • 新准则规定
  • 已计提完的固定资产怎么弄
  • 基于transformers的nlp入门 pdf
  • js中数组方法有哪些
  • dns configuration
  • php页面刷新
  • 发票作废有费用吗
  • 应付短期租入固定资产的租金计入什么科目
  • 合伙人退伙后对退伙后的债务承担责任吗
  • 税务已注销工商如何注销
  • sql server 2008简介
  • sqlserver2005安装后怎么打开
  • 无票收入不走对公账户
  • 印花税的征收方式有哪些
  • 借款费用为什么可以企业所得税税前扣除
  • 公司购买的空调
  • 建造生产线计入什么科目
  • 预缴所得税弥补以前年度亏损
  • 建筑业预缴税款怎么退税
  • 企业盘亏的设备会计分录
  • 加计扣除10%进项税政策文件
  • 视同销售但未收到钱怎么做账?
  • 股东借款转实收资本
  • 原始凭证填制要点在原始凭证上书写阿拉伯数字正确的有
  • win8 联网
  • windows 10 build 9888
  • centos运行文件
  • bios怎么调高性能
  • linux如何开启ftp
  • imscmig.exe
  • js实现用户登录
  • element拖拽
  • java物流功能
  • opengl教程48讲
  • python 脚本管理
  • [置顶] 启动unity3d 提示“unity3d EditorWindow could not be loaded because the script is not found in the projec”
  • web开发手机app
  • 使用js检测浏览器的网站
  • jquery datatable服务端分页
  • 置顶聊天折叠怎么关闭
  • python用什么编辑
  • 全面解析白羊座o型血女
  • 辽宁社保网上申报流程图
  • 如何理解税收制度的含义
  • 深圳市国家税务局电话
  • 如何落实请示汇报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设