位置: IT常识 - 正文

JS—节流与防抖(js防抖函数和节流函数)

编辑:rootadmin
JS—节流与防抖 一、js防抖和节流

推荐整理分享JS—节流与防抖(js防抖函数和节流函数),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js的防抖和节流是什么意思,js防抖函数和节流函数,js防抖节流的写法,js节流和防抖的区分和实现详解,js节流防抖区别,js防抖节流的写法,js节流和防抖的区分和实现详解,js防抖节流的写法,内容如对您有帮助,希望把文章链接给更多的朋友!

在进行窗口的resize、scroll、输出框内容校验等操纵的时候,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常之差。那么为了前端性能的优化也为了用户更好的体验,就可以采用防抖(debounce)和节流(throttle)的方式来到达这种效果,减少调用的频率。

二、为什么滚动scroll、窗口resize等事件需要优化

滚动事件的应用很频繁:图片懒加载、下滑自动加载数据、侧边浮动导航栏等。

在绑定scroll、resize事件时,但它发生的时候,它被触发的频率非常高,间隔很近。在日常开发的页面中,事件中涉及到的大量的位置计算、DOM操作、元素重绘等等这些都无法在下一个scroll事件出发前完成的情况下,浏览器会卡帧。

三、滚动和页面渲染前端性能优化的关系

为什么滚动需要优化?前面提到了事件中涉及到大量的位置计算、DOM操作、元素重绘等等,这些又与页面的渲染有关系,页面渲染又与前端的性能优化有关系?套娃一样,一层套着一层,每一层都联系紧密,每一层都如此平凡且重要。

review一下前端的渲染和优化

web页面展示经历的步骤:js—style—layout—paint—composite,简单回顾一下,在这里不做详细的介绍哦!

网页生成的时候,至少会渲染(Layout+Paint)一次。用户访问的过程中,还会不断重新的重排(reflow)和重绘(repaint),用户scroll行为和resize行为会导致页面不断的进行重新渲染,而且间隔频繁,容易造成浏览器卡帧。

四、防抖Debounce(1)防抖Debounce情景JS—节流与防抖(js防抖函数和节流函数)

①有些场景事件触发的频率过高(mousemove onkeydown onkeyup onscroll)

②回调函数执行的频率过高也会有卡顿现象。 可以一段时间过后进行触发去除无用操作

(2)防抖原理

一定在事件触发 n 秒后才执行,如果在一个事件触发的 n 秒内又触发了这个事件,以新的事件的时间为准,n 秒后才执行,等触发事件 n 秒内不再触发事件才执行。

官方解释:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。

(3)防抖函数简单实现 //简单的防抖函数 function debounce(func, wait, immediate) { //定时器变量 var timeout; return function () { //每次触发scrolle,先清除定时器 clearTimeout(timeout); //指定多少秒后触发事件操作handler timeout = setTimeout(func, wait); }; }; //绑定在scrolle事件上的handler function handlerFunc() { console.log('Success'); } //没采用防抖动 window.addEventListener('scroll', handlerFunc); //采用防抖动 window.addEventListener('scrolle', debounce(handlerFunc, 1000));(4)防抖函数的演化过程①this event绑定问题 //以闭包的形式返回一个函数,内部解决了this指向的问题,event对象传递的问题 function debounce(func, wait) { var timeout; return function () { var context = this; var args = arguments; clearTimeout(timeout) timeout = setTimeout(function () { func.apply(context, args) }, wait); }; };②立即触发问题 //首次触发执行,再次触发以后开始执行防抖函数 //使用的时候不用重复执行这个函数,本身返回的函数才具有防抖功能function debounce(func, wait, immediate) { var timeout; return function () { var context = this; var args = arguments; if(timeout) clearTimeout(timeout); // 是否在某一批事件中首次执行 if (immediate) { var callNow = !timeout; timeout = setTimeout(function() { timeout = null; func.apply(context, args) immediate = true; }, wait); if (callNow) { func.apply(context, args) } immediate = false; } else { timeout = setTimeout(function() { func.apply(context, args); immediate = true; }, wait); } }}③返回值问题function debounce(func, wait, immediate) { var timeout, result; return function () { var context = this, args = arguments; if (timeout) clearTimeout(timeout); if (immediate) { var callNow = !timeout; timeout = setTimeout(function() { result = func.apply(context, args) }, wait); if (callNow) result = func.apply(context, args); } else { timeout = setTimeout(function() { result = func.apply(context, args) }, wait); } return result; }}④取消防抖,添加cancel方法function debounce(func, wait, immediate) { var timeout, result; function debounced () { var context = this, args = arguments; if (timeout) clearTimeout(timeout); if (immediate) { var callNow = !timeout; timeout = setTimeout(function() { result = func.apply(context, args) }, wait); if (callNow) result = func.apply(context, args); } else { timeout = setTimeout(function() { result = func.apply(context, args) }, wait); } return result; } debounced.cancel = function(){ cleatTimeout(timeout); timeout = null; } return debounced;}五、节流Throttle(1)节流Throttle情景

①图片懒加载

②ajax数据请求加载

(2)节流原理

如果持续触发事件,每隔一段时间只执行一次函数。

官方解释:当持续触发事件时,保证一定时间段内只调用一次事件处理函数。

(3)节流实现—时间戳和定时器时间戳 var throttle = function (func, delay) { var prev = Date.now() return function () { var context = this; var args = arguments; var now = Date.now(); if (now - prev >= delay) { func.apply(context, args); prev = Date.now(); } } } function handle() { console.log(Math.random()); } window.addEventListener('scroll', throttle(handle, 1000));定时器 var throttle = function (func, delay) { var timer = null; return function () { var context = this; var args = arguments; if (!timer) { timer = setTimeout(function () { func.apply(context, args); timer = null; }, delay); } } } function handle() { console.log(Math.random()); } window.addEventListener('scroll', throttle(handle, 1000))(4)节流函数的演化过程①时间戳触发//在开始触发时,会立即执行一次; 如果最后一次没有超过 wait 值,则不触发function throttle(func, wait) { var context, args; var previous = 0; // 初始的时间点,也是关键的时间点 return function() { var now = +new Date(); context = this; args = arguments; if (now - previous > wait) { func.apply(context, args); previous = now; } }}②定时器触发//首次不会立即执行,最后一次会执行,和用时间戳的写法互补。function throttle(func, wait){ var context, args, timeout; return function() { context = this; args = arguments; if(!timeout) { timeout = setTimeout(function(){ func.apply(context, args); timeout = null; }, wait); } }}③结合时间戳和定时器function throttle(func, wait) { var timer = null; var startTime = Date.now(); return function(){ var curTime = Date.now(); var remaining = wait-(curTime-startTime); var context = this; var args = arguments; clearTimeout(timer); if(remaining<=0){ func.apply(context, args); startTime = Date.now(); }else{ timer = setTimeout(fun, remaining); // 如果小于wait 保证在差值时间后执行 } }}六、节流防抖总结

防抖:原理是维护一个定时器,将很多个相同的操作合并成一个。规定在delay后触发函数,如果在此之前触发函数,则取消之前的计时重新计时,只有最后一次操作能被触发。

节流:原理是判断是否达到一定的时间来触发事件。某个时间段内只能触发一次函数。

区别:防抖只会在最后一次事件后执行触发函数,节流不管事件多么的频繁,都会保证在规定时间段内触发事件函数。

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

上一篇:JS实现轮播图(一看就懂逻辑清晰)(js轮播图视频教程)

下一篇:Vue中 provide、inject 详解及使用

  • 红米note11息屏显示时间

    红米note11息屏显示时间

  • 苹果nfc怎么复制门禁卡(苹果NFC怎么复制门卡)

    苹果nfc怎么复制门禁卡(苹果NFC怎么复制门卡)

  • 小米10支持的音频格式有哪些(小米10支持的音频)

    小米10支持的音频格式有哪些(小米10支持的音频)

  • 监控用户名和密码忘了怎么办(监控用户名和密码在哪里看到)

    监控用户名和密码忘了怎么办(监控用户名和密码在哪里看到)

  • 快手为什么不能一次性点完所有作品(快手为什么不能搜索视频)

    快手为什么不能一次性点完所有作品(快手为什么不能搜索视频)

  • 淘宝卖家发货地址与实际地址不一样可以吗(淘宝卖家发货地址可以随便写吗)

    淘宝卖家发货地址与实际地址不一样可以吗(淘宝卖家发货地址可以随便写吗)

  • 和对方的微信聊天记录怎么恢复(和对方的微信聊天记录可以转到我的手机上吗)

    和对方的微信聊天记录怎么恢复(和对方的微信聊天记录可以转到我的手机上吗)

  • se2是5g吗(苹果se2是5g吗)

    se2是5g吗(苹果se2是5g吗)

  • 苹果7p手机发热怎么处理(苹果7p手机发热降频如何解决)

    苹果7p手机发热怎么处理(苹果7p手机发热降频如何解决)

  • 抖音视频垂直是什么意思(抖音视频垂直是怎么回事)

    抖音视频垂直是什么意思(抖音视频垂直是怎么回事)

  • 苹果8p返回键怎么弄(苹果8p返回键怎么取消)

    苹果8p返回键怎么弄(苹果8p返回键怎么取消)

  • 苹果手机可以下载万能钥匙吗(苹果手机可以下载万能wifi钥匙吗)

    苹果手机可以下载万能钥匙吗(苹果手机可以下载万能wifi钥匙吗)

  • 抖音号码注销后好友能看见吗(抖音号码注销后多久可以绑定)

    抖音号码注销后好友能看见吗(抖音号码注销后多久可以绑定)

  • 华为9x升降镜头怎么用(华为x9升降摄像头怎么打开)

    华为9x升降镜头怎么用(华为x9升降摄像头怎么打开)

  • iphone8打字震动没有了(iphone的打字震动)

    iphone8打字震动没有了(iphone的打字震动)

  • 淘宝hd什么意思(淘宝 淘宝hd)

    淘宝hd什么意思(淘宝 淘宝hd)

  • gtx1070配什么内存

    gtx1070配什么内存

  • wps表格关键字查找(wps表格怎么查找关键字)

    wps表格关键字查找(wps表格怎么查找关键字)

  • 小米手环4可以看小说吗(小米手环4可以刷门禁卡吗)

    小米手环4可以看小说吗(小米手环4可以刷门禁卡吗)

  • 三星s6edge呼叫转移在哪里(三星呼叫转移怎么开)

    三星s6edge呼叫转移在哪里(三星呼叫转移怎么开)

  • 手机开屏有热点资讯怎么办(手机开屏有热点资讯滑动解锁)

    手机开屏有热点资讯怎么办(手机开屏有热点资讯滑动解锁)

  • 苹果mt762ch/a是什么型号(苹果mt752ch/a和mt762ch/a区别)

    苹果mt762ch/a是什么型号(苹果mt752ch/a和mt762ch/a区别)

  • 小米手机怎么打开蓝牙音频LDAC(小米手机怎么打开定位)

    小米手机怎么打开蓝牙音频LDAC(小米手机怎么打开定位)

  • y93的hd在哪关闭(y9s怎么关闭hd)

    y93的hd在哪关闭(y9s怎么关闭hd)

  • 微信设备锁在哪里解除(微信设备锁在哪里设置OPPO)

    微信设备锁在哪里解除(微信设备锁在哪里设置OPPO)

  • 苹果8pnfc功能在哪里打开(苹果8pnfc功能在哪里开启)

    苹果8pnfc功能在哪里打开(苹果8pnfc功能在哪里开启)

  • 为什么说人与人要相互尊重(为什么说人与人的悲欢不相通)

    为什么说人与人要相互尊重(为什么说人与人的悲欢不相通)

  • 苹果mac修改用户名与密码的方法 苹果电脑如何修改开机密码(苹果mac修改用户名和密码)

    苹果mac修改用户名与密码的方法 苹果电脑如何修改开机密码(苹果mac修改用户名和密码)

  • C++指针与其它复合类型(c++如何给指针赋值)

    C++指针与其它复合类型(c++如何给指针赋值)

  • 所得税费用是什么要素
  • 代第三方收取的款项作为什么处理
  • 小规模销售产品会计分录
  • 离职员工个税申报时员工状态依然是雇员
  • 房产出租增值税税目
  • 行政单位利息收入是非税收入吗
  • 资产负债表中的货币资金怎么算
  • 用于连续生产的消费税计入
  • 安置残疾人就业税收优惠政策
  • 商场返现活动怎么入账
  • 营改增后服务业增值税税率
  • 电商平台收取会员费吗
  • 国外出差差旅费
  • 可供出售金融资产改为什么科目
  • 人力资源公司劳务派遣怎么收费
  • 不动产进项税额抵扣最新通知2023
  • 隔年的费用发票怎样入账
  • 开增值税发票开户行怎么填?
  • 营改增之后税务是否可以征收入库?
  • 公司购买汽车的购置税怎么做账
  • 2018新个税
  • 农产品购货发票
  • 反映留存收益的账户
  • 收到几分钱的认证费怎么做账
  • 生产企业原材料的订购与运输建模
  • uefi系统安装win7gho
  • 固定资产拆除怎么处理
  • 加班车费报销计入什么科目
  • 大家在抢红包怎么回复
  • 内格罗斯岛
  • php的get
  • php floor()
  • 酒店没有营业执照可以举报吗?
  • 深入解析wordpress
  • 低值易耗品是怎样的
  • 约克大教堂是基督教吗
  • 信用减值损失在借方是增加还是减少
  • 支付第三方劳务费计入什么科目
  • 土地增值税的扣除项目金额怎么算
  • 冲减管理费用为什么放在借方
  • 房屋扩建后折旧费怎么算
  • 财务费用相关指标
  • 企业年度关联业务往来报告表必须填吗
  • 装修消防改造费用会计分录
  • 有限公司能变更成个体工商户吗
  • 甲供材料怎么记账
  • 小微企业免税销售额是多少2023年
  • 应付账款不用付情况说明
  • 以货换货合同
  • 供应商折扣一次多少
  • 收到现金货款怎么处理
  • 企业哪些部门
  • 小规模纳税人没有进项发票违法吗
  • 印花税申报流程视频
  • 其他应收款科目核算哪些业务
  • 退回的银行手续费做什么科目
  • 营改增账务处理实例
  • 结账前要做哪些准备工作
  • sqlmap 提权
  • unix du
  • win10怎么预览文件
  • linux动态库的制作
  • 去掉快捷功能
  • win7系统有wifi功能吗
  • win7关闭窗口的方式有哪些
  • 电脑的技巧
  • win8换win10系统步骤
  • exe文件xp3
  • Win7电脑自动关机是什么原因
  • android开发流程
  • 拉伸设置
  • glimp使用方法
  • javascript中的eval函数
  • 游戏输入法安卓
  • python把html页面生成图片
  • unity3d从入门到精通
  • linux使用ssh远程连接服务器
  • jquery on()
  • 浙江税务客服咨询电话
  • 北京税务总局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设