scroll 事件本身会触发页面的重新渲染,同时 scroll 事件的 handler 又会被高频度的触发, 因此事件的 handler 内部不应该有复杂操作,例如 DOM 操作就不应该放在事件处理中。

针对此类高频度触发事件问题(例如页面 scroll ,屏幕 resize,监听用户输入等),下面介绍两种常用的解决方法,防抖和节流。

防抖(Debouncing)

防抖技术即是可以把多个顺序地调用合并成一次,也就是在一定时间内,规定事件被触发的次数。

通俗一点来说,看看下面这个简化的例子:

// 简单的防抖动函数
function debounce(func, wait, immediate) {// 定时器变量var timeout;return function() {// 每次触发 scroll handler 时先清除定时器clearTimeout(timeout);// 指定 xx ms 后触发真正想进行的操作 handlertimeout = setTimeout(func, wait);};
};// 实际想绑定在 scroll 事件上的 handler
function realFunc(){console.log("Success");
}// 采用了防抖动
window.addEventListener('scroll',debounce(realFunc,500));
// 没采用防抖动
window.addEventListener('scroll',realFunc);

上面简单的防抖的例子可以拿到浏览器下试一下,大概功能就是如果 500ms 内没有连续触发两次 scroll 事件,那么才会触发我们真正想在 scroll 事件中触发的函数。

上面的示例可以更好的封装一下:

// 防抖动函数
function debounce(func, wait, immediate) {var timeout;return function() {var context = this, args = arguments;var later = function() {timeout = null;if (!immediate) func.apply(context, args);};var callNow = immediate && !timeout;clearTimeout(timeout);timeout = setTimeout(later, wait);if (callNow) func.apply(context, args);};
};var myEfficientFn = debounce(function() {// 滚动中的真正的操作
}, 250);// 绑定监听
window.addEventListener('resize', myEfficientFn);

节流(Throttling)

防抖函数确实不错,但是也存在问题,譬如图片的懒加载,我希望在下滑过程中图片不断的被加载出来,而不是只有当我停止下滑时候,图片才被加载出来。又或者下滑时候的数据的 ajax 请求加载也是同理。

这个时候,我们希望即使页面在不断被滚动,但是滚动 handler 也可以以一定的频率被触发(譬如 250ms 触发一次),这类场景,就要用到另一种技巧,称为节流函数(throttling)。

节流函数,只允许一个函数在 X 毫秒内执行一次。

与防抖相比,节流函数最主要的不同在于它保证在 X 毫秒内至少执行一次我们希望触发的事件 handler。

与防抖相比,节流函数多了一个 mustRun 属性,代表 mustRun 毫秒内,必然会触发一次 handler ,同样是利用定时器,看看简单的示例:

// 简单的节流函数
function throttle(func, wait, mustRun) {var timeout,startTime = new Date();return function() {var context = this,args = arguments,curTime = new Date();clearTimeout(timeout);// 如果达到了规定的触发时间间隔,触发 handlerif(curTime - startTime >= mustRun){func.apply(context,args);startTime = curTime;// 没达到触发间隔,重新设定定时器}else{timeout = setTimeout(func, wait);}};
};
// 实际想绑定在 scroll 事件上的 handler
function realFunc(){console.log("Success");
}
// 采用了节流函数
window.addEventListener('scroll',throttle(realFunc,500,1000));

上面简单的节流函数的例子可以拿到浏览器下试一下,大概功能就是如果在一段时间内 scroll 触发的间隔一直短于 500ms ,那么能保证事件我们希望调用的 handler 至少在 1000ms 内会触发一次。

文章转载于:https://www.cnblogs.com/coco1s/p/5499469.html

JS防抖(Debouncing)和节流(Throttling)相关推荐

  1. 防抖(debounce) 和 节流(throttling)

    防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案. 在给DOM绑定事件时,有些事件我们是无法控制触发频率的. 如鼠标移动事件onmousemove, 滚动滚动条事件onscroll,窗口大小改 ...

  2. 防抖(debounce) 和 节流(throttling)的封装使用-最终发布npm

    函数的防抖节流 前言 防抖函数 防抖函数(雏形) 防抖函数1.0(使用了闭包) 防抖函数2.0(此版本开始才称得上是封装) 防抖函数3.0(希望第一次点击就立即触发) 防抖函数4.0(解决this指向 ...

  3. vue 节流throttling防抖debounce

    节流和防抖常用与监听滚动事件,移动事件,窗口改变大小事件,输入事件等高频触发事件,当事件处理函数较为复杂时,将导致无法实时响应,降低用户体验度,影响效率,出现页面卡顿,假死等现象. debounce  ...

  4. 面试必问题:JS防抖与节流

    摘要:防抖与节流可谓是面试常见,其实很好理解,下面带你分分钟了解防抖与节流的基本思想与写法~ 本文分享自华为云社区<JS防抖与节流快速了解与应用>,作者:北极光之夜. . 一.速识防抖: ...

  5. 2019 面试准备 - JS 防抖与节流 (超级 重要!!!!!)

    Hello 小伙伴们,如果觉得本文还不错,记得给个 star , 你们的 star 是我学习的动力!GitHub 地址 本文涉及知识点: 防抖与节流 重绘与回流 浏览器解析 URL DNS 域名解析 ...

  6. js中的函数防抖和函数节流

    1.什么是函数防抖和函数节流 防抖(debounce)和节流(throttle)都是用来控制某个函数在一定时间内执行多少次的技巧,两者相似不相同,基本思想都是某些代码不可以在没有间断的情况下连续重复执 ...

  7. JavaScript防抖功能(js防抖函数,防抖功能的应用与解析,手把手教学)

    简述:js的防抖功能大家都比较熟悉,这里重新给大家详细的介绍一下js防抖函数的解析与应用.防抖就是某一高频事件不断被触发时,仅在最后一次真正执行事件处理代码,将多次执行变为最后一次执行,具体点就是我们 ...

  8. 函数防抖 和 函数节流

    函数防抖 和 函数节流 函数防抖(debounce) 概念 函数防抖 就是指 触发事件后 在 n 秒内 函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间. 简单的说,当一个动作 ...

  9. 防抖debounce和节流throttle

    大纲 一.出现缘由 二.什么是防抖debounce和节流throttle 三.应用场景 3.1防抖 3.2节流 一.出现缘由 前端开发中,有一部分用户行为会频繁触发事件,而对于DOM操作,资源加载等耗 ...

最新文章

  1. mysql schedule event,MySQL 定时器event
  2. linux go redis,godis: go实现的一个redis项目, 很好还有博客,非常值得学习
  3. 第七十九期:阿里程序员感慨:码农们过去暴富有多轻松,现在赚钱就有多辛苦
  4. c ++查找字符串_C ++类和对象| 查找输出程序| 套装3
  5. 【云速建站】SSL证书自助部署
  6. 2018北大计算机复试线,2018年北京大学考研复试分数线已公布
  7. 18、led驱动程序的实现
  8. c语言b20等于多少,C语言程序:温度DS19B20显示
  9. Android UI学习之RadioButton和RadioGroup
  10. 微信打电话和直接打电话有什么区别吗?为什么?
  11. 简单循迹小车实验心得_智能小车实验报告
  12. BFS解小孩分油问题
  13. css 毛玻璃: backdrop-filter
  14. 火星南极有水,会有生命吗?
  15. Sublime 查看Json格式数据
  16. 侯捷 C++内存管理
  17. https 请求的端口是443 注意
  18. 张一鸣的“成事哲学”:取势、明道、优术、践行、合众
  19. 生兔子c语言递归的方法,经典的兔子生兔子问题(C#递归解法)
  20. ppt_第十章_DNA非卷积视觉技术

热门文章

  1. 笔记本电脑设备管理器找不到独立显卡的解决方案
  2. 《勋伯格和声学》读书笔记(八):转调
  3. mac 下使用ssh
  4. 自我介绍一分钟范文(碎的)
  5. 36艺教育完成3000万元Pre-A轮融资,星火资本投资 1
  6. Linux启动过程基本指南
  7. 【多智能体感知与协同调度】
  8. Xposed插件开发环境配置
  9. Allegro 小知识总结
  10. java基础复习——day18(Stream流 ; 反射)