深入了解JavaScript 防抖和节流


Posted in Javascript onSeptember 12, 2019

概述

说明

在项目过程中,经常会遇到一个按钮被多次点击并且多次调用对应处理函数的问题,而往往我们只需去调用一次处理函数即可。有时也会遇到需要在某一规则内有规律的去触发对应的处理函数,所以就需要使用到函数防抖与函数节流来帮助我们实现我们想要的结果以及避免不必要的问题产生。

函数防抖(debounce)

定义:当持续触发事件时(如连续点击按钮多此),一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,有一次触发了事件,就重新开始延时。

原理:维护一个计时器,规定在延时时间后触发函数,但是在延时时间内再次被触发的话,就取消之前的计时器而重新设置,这样就能够保证只有最后一次操作被触发。即将所有操作合并为一个操作进行,并且只有最后一次操作是有效操作。

函数节流(throttle)

定义:当持续触发事件时,保证一定时间段内只调用一次事件处理函数,按照一定的规律在某个时间间隔内去处理函数。

原理:原理是通过判断是否达到一定时间来触发函数,使得一定时间内只触发一次函数。

代码

函数防抖

触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间

每次触发事件时都取消之前的延时调用方法

function debounce(fn) {
  let timeout = null; // 创建一个标记用来存放定时器的返回值
  return function () {
  clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉
  timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数
    fn.apply(this, arguments);
  }, 500);
  };
}
function sayHi() {
  console.log('防抖成功');
}

var inp = document.getElementById('inp');
inp.addEventListener('input', debounce(sayHi)); // 防抖

函数节流

高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率

每次触发事件时都判断当前是否有等待执行的延时函数

function throttle(fn) {
  let canRun = true; // 通过闭包保存一个标记
  return function () {
  if (!canRun) return; // 在函数开头判断标记是否为true,不为true则return
  canRun = false; // 立即设置为false
  setTimeout(() => { // 将外部传入的函数的执行放在setTimeout中
    fn.apply(this, arguments);
    // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。当定时器没有执行的时候标记永远是false,在开头被return掉
    canRun = true;
  }, 500);
  };
}
function sayHi(e) {
  console.log(e.target.innerWidth, e.target.innerHeight);
}
window.addEventListener('resize', throttle(sayHi));

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js变换显示图片的实例
Apr 16 Javascript
js控制表单不能输入空格的小例子
Nov 20 Javascript
jQuery实用技巧必备(下)
Nov 03 Javascript
日常收藏的jquery技巧
Dec 02 Javascript
使用Vue.js创建一个时间跟踪的单页应用
Nov 28 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
Dec 25 Javascript
JavaScript数组_动力节点Java学院整理
Jun 26 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
Oct 19 Javascript
vue-router重定向不刷新问题的解决
Jun 25 Javascript
js代码实现轮播图
May 04 Javascript
vue路由权限校验功能的实现代码
Jun 07 Javascript
详解node.js 事件循环
Jul 22 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
Sep 12 #Javascript
使用layer.msg 时间设置不起作用的解决方法
Sep 12 #Javascript
浅谈bootstrap layer.open中end的使用方法
Sep 12 #Javascript
layer iframe 设置关闭按钮的方法
Sep 12 #Javascript
改变layer confirm弹窗按钮的颜色方法
Sep 12 #Javascript
layer提示框添加多个按钮选择的实例
Sep 12 #Javascript
记录vue做微信自定义分享的一些问题
Sep 12 #Javascript
You might like
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
简单的PHP图片上传程序
2008/03/27 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
php注册登录系统简化版
2020/12/28 PHP
Symfony查询方法实例小结
2017/06/28 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
PHP7 其他修改
2021/03/09 PHP
javascript eval和JSON之间的联系
2009/12/31 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
Python中 传递值 和 传递引用 的区别解析
2018/02/22 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
opencv python图像梯度实例详解
2020/02/04 Python
Python导入数值型Excel数据并生成矩阵操作
2020/06/09 Python
python statsmodel的使用
2020/12/21 Python
CSS3中Color的一些特性介绍
2012/05/27 HTML / CSS
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
应届毕业生自我评价分享
2013/12/15 职场文书
酒店保安领班职务说明书
2014/03/04 职场文书
电视购物广告词
2014/03/19 职场文书
个人原因辞职信模板
2015/05/13 职场文书
养成教育工作总结
2015/08/13 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
JavaScript流程控制(循环)
2021/12/06 Javascript
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis