防抖、节流探究

节流、防抖探究

以下场景往往由于事件频繁被触发,因而频繁执行DOM操作、资源加载等重行为,导致UI停顿甚至浏览器崩溃。

  1. window对象的resize、scroll事件

  2. 拖拽时的mousemove事件

  3. 文字输入、自动完成的keyup事件

  4. 用户快速click事件

针对这样的需求就出现了debouncethrottle两种解决办法。

比如:实现一个原生的拖拽功能(不能用 H5 Drag&Drop API),需要一路监听 mousemove 事件,在回调中获取元素当前位置,然后重置 dom 的位置。如果我们不加以控制,每移动一定像素而触发的回调数量是会非常惊人的,回调中又伴随着 DOM 操作,继而引发浏览器的重排与重绘,性能差的浏览器可能就会直接假死,这样的用户体验是非常糟糕的。我们需要做的是降低触发回调的频率,比如让它 500ms 触发一次,或者 200ms,甚至 100ms,这样的解决方案就是函数节流


节流函数节流的核心是,让一个函数不要执行得太频繁,减少一些过快的调用。
在这里插入图片描述

// 代码片段
const throttle = (fn, timeGap) => {
  var last;
   // 定时器
   var timer;
   return function () {
       // 保存函数调用时的上下文和参数,传递给 fn
       var context = this;
       var args = arguments;
       // console.log(args, 'args');
       var now = +new Date();
       // 执行 fn,并重新计时
       if (last && now < last + timeGap) {
           clearTimeout(timer);
           // 保证在当前时间区间结束后,再执行一次 fn
           timer = setTimeout(function () {
               last = now;
               fn.apply(context, args);
           }, timeGap)
           // 在时间区间的最开始和到达指定间隔的时候执行一次 fn
       } else {
           last = now;
           fn.apply(context, args);
       }
   };
};

对于浏览器窗口,每做一次 resize 操作,发送一个请求,就需要监听 resize 事件,但是和 mousemove 一样,每缩小(或者放大)一次浏览器,实际上会触发 N 多次的 resize 事件,用节流的话,节流只能保证定时触发,我们一次就好,这就要用去抖。
简单的说,函数去抖就是对于一定时间段的连续的函数调用,只让其执行一次。
https://images2018.cnblogs.com/blog/1022151/201806/1022151-20180613144209623-862434090.jpg

// 代码片段
const debounce = (fn, time) => {
   let timer = null;
   return function () {
       // console.log('arguments', args);
       clearTimeout(timer);
       const args = arguments;
       const context = this;
       timer = setTimeout(() => {
           fn && fn.apply(context, args);
       }, time);
   };
};

以下是自己在实际项目中遇到的问题:

描述:当单击头像显示个人资料页,双击没有任何反应。

在这里插入图片描述
这是上述图片的clickFun函数

var last;
var timer = null;
function clickFun(e) {
  const now = new Date().getTime();
  if (last) {
      clearTimeout(timer);
      timer = null;
      if (now - last > 400) {
          timer = setTimeout(() => {
              clickThrottle(e);
          }, 400);
      }
      last = now;
  }
  else {
      timer = setTimeout(() => {
          clickThrottle(e);
      }, 400);
      last = now;
  }
}

如果使用去抖的话,在指定时间内可能会多次执行的只会被打包成一次。那如果用户过一段时间再次进行单击/双击操作的话,双击其实还是会进行操作,并不能达到想要的效果,所以这里才用了节流跟定时器的结合(当用户进行点击的时候,在*秒内只能触发一次,这样就可以规避双击的问题)。

总结:

节流throttle :使得一定时间内只触发一次函数。
它和防抖动最大的区别就是,节流函数不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而防抖动只是在最后一次事件后才触发一次函数。
原理是通过判断是否到达一定时间来触发函数,若没到规定时间则使用计时器延后,而下一次事件则会重新设定计时器。

防抖动debounce:将几次操作合并为一此操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值