资讯专栏INFORMATION COLUMN

20190726-前端笔记-防抖和节流

JasinYip / 630人阅读

摘要:定义定时器清空定时器重置定时器防抖流程触发触发定义一个定时器,返回执行内容为清除当前定时器,定义执行内容。

防抖

</>复制代码

  1. 为了避免一些监听事件为在自己预料的情况,频繁触发。or 在某些监听命令会频繁触发事件比如resizemousemove等等
未防抖 示例

</>复制代码

  1. var count = 0,
  2. Elem = doc.getElementById("con")
  3. function appendCount(e) {
  4. console.log(e);
  5. Elem.innerHTML = count++
  6. }
  7. // 正常,没有防抖的情况下,直接监听执行
  8. Elem.addEventListener("mousemove", function() {
  9. appendCount()
  10. })

这会导致,只要鼠标移动,会导致Eelm.innerHTML不断改变。现在看起来好像没什么问题,如果是很多数据渲染或者请求几千条列表数据呢?

会导致浏览器不断回流和重绘。

那如何防抖呢??

触发mousemove时间后1s内,只有不在触发mousemove方法才会能执行appendCount()

</>复制代码

  1. var count = 0,
  2. Elem = doc.getElementById("con");
  3. function debounce(fn, waitTime){
  4. // 定义定时器
  5. var timeoutFn = null;
  6. return function (){
  7. // 清空定时器
  8. clearTimeout(timeoutFn);
  9. // 重置定时器
  10. timeoutFn = (() => {
  11. fn.apply(this, arguments)
  12. },waitTime)
  13. }
  14. }
  15. function appendCount(){
  16. ELem.innerHTML=count++;
  17. }
  18. Elem.addEventListener("mousemove", debounce(appendCount, 500))
防抖流程

mousemove触发,触发debounce()`

定义一个定时器timeoutFn,返回执行内容为:清除当前timeoutFn定时器( timeoutFn = null;),定义执行内容。

</>复制代码

  1. // debounce() 返回内容
  2. function (){
  3. // 清空定时器
  4. clearTimeout(timeoutFn);
  5. // 重置定时器
  6. timeoutFn = (() => {
  7. fn.apply(this, arguments)
  8. },waitTime)
  9. }

mousemove再触发,timeoutFn定时器再次清空,重新定义执行内容

只有等到最后一次mousemove,定时器没有被debounce()清除timeoutFn定时器,最后执行 fn.apply(this, agruments);

节流

</>复制代码

  1. 相对比防抖,我是这样理解节流的:当我们想触发在一段时间范围有且只触发一次这样的事件,这样我们可以更节约我们的资源和网络请求。

就当上面的AppendCount()举例,我只想在3s内之能触发一次事件AppendCount()

那么应该怎么处理呢?

</>复制代码

  1. var count = 0,
  2. Elem = doc.getElementById("con");
  3. function throttle(fn,waitTime){
  4. var timeoutFn = null;
  5. return function () {
  6. // 如果存在timeoutFn定时器,则等待timeoutFn执行完成
  7. if(!timeoutFn){
  8. timeoutFn = (() => {
  9. // 置空定时器
  10. clearTimeout(timeoutFn)
  11. fn.apply(this, arguments)
  12. },waitTime)
  13. }
  14. }
  15. }
  16. function appendCount(){
  17. ELem.innerHTML=count++;
  18. }
  19. Elem.addEventListener("mousemove", throttle(appendCount, 3000))

这和防抖不同的是,是等待timeoutFn执行完成后,通过clearTimeout(timeoutFn)置空,那么在3s后才能再次执行timeoutFn

还有一个写法,和上面有一点不同,上面的是当在第1s触发throttle,但是要在第4s才能执行appendCount。但是下面是立即执行,当第1s触发throttle,就执行appendCount,然后在第4s后可以再次会发throttle

</>复制代码

  1. var count = 0,
  2. Elem = doc.getElementById("con");
  3. function throttle(fn, waitTime){
  4. // 定义定时器、执行状态
  5. var timeoutFn = null,
  6. isRuning = false;
  7. return function () {
  8. // 如果不在执行状态
  9. if(!isRuning){
  10. // 开启执行状态
  11. isRuning = true;
  12. // 定义定时器
  13. timeoutFn =(() => {
  14. fn.apply(this, arguments);
  15. // 执行完成,关闭执行状态
  16. isRuning = false;
  17. },waitTime)
  18. }
  19. }
  20. }
  21. function appendCount(){
  22. ELem.innerHTML=count++;
  23. }
  24. Elem.addEventListener("mousemove", throttle(appendCount, 3000))
参考

JavaScript专题之跟着underscore学节流

JavaScript专题之跟着underscore学防抖

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106055.html

相关文章

  • 20190726-前端笔记-抖和节流

    摘要:定义定时器清空定时器重置定时器防抖流程触发触发定义一个定时器,返回执行内容为清除当前定时器,定义执行内容。 防抖 为了避免一些监听事件为在自己预料的情况,频繁触发。or 在某些监听命令会频繁触发事件比如resize、mousemove等等 未防抖 示例 var count = 0, Elem = doc.getElementById(con) ...

    Thanatos 评论0 收藏0
  • 彻底弄懂函数抖和函数节流

    摘要:若时间差大于间隔时间,则立刻执行一次函数。不同点函数防抖,在一段连续操作结束后,处理回调,利用和实现。函数防抖关注一定时间连续触发的事件只在最后执行一次,而函数节流侧重于一段时间内只执行一次。 原博客地址,欢迎star 函数防抖和节流 函数防抖和函数节流:优化高频率执行js代码的一种手段,js中的一些事件如浏览器的resize、scroll,鼠标的mousemove、mouseover...

    Mr_houzi 评论0 收藏0
  • 剖析前端开发中的抖和节流

    摘要:运用防抖和节流可以有效降低代码的执行频率,从而解决高频率事件的页面卡顿问题。在阶段布局,最终确定显示的位置和大小。在函数中,首先定义了一个空的定时器变量,用来计算时间间隔。还有一点要注意,在中一定要清楚定时器,不然会影响的条件判断。 啥是节流? 节流是保证在一段时间内,代码只执行了一次。这个一段时间内指的是不管用户操作了几次,最终仅执行一次。比如说一个按钮,用户狂点按钮,但是如果用节流...

    andong777 评论0 收藏0
  • 剖析前端开发中的抖和节流

    摘要:运用防抖和节流可以有效降低代码的执行频率,从而解决高频率事件的页面卡顿问题。在阶段布局,最终确定显示的位置和大小。在函数中,首先定义了一个空的定时器变量,用来计算时间间隔。还有一点要注意,在中一定要清楚定时器,不然会影响的条件判断。 啥是节流? 节流是保证在一段时间内,代码只执行了一次。这个一段时间内指的是不管用户操作了几次,最终仅执行一次。比如说一个按钮,用户狂点按钮,但是如果用节流...

    LeexMuller 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<