热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

button执行onclick函数_从应用场景助你理解函数防抖与函数节流

防抖(debounce)函数防抖(debounce):当持续触发事件时,在设置的周期内没有再触发事件,事件处理函数才会执行一次࿰
防抖(debounce)

函数防抖(debounce):当持续触发事件时,在设置的周期内没有再触发事件,事件处理函数才会执行一次,如果设定的周期没有结束,又一次触发了事件,就重新开始延时。

为了有个直观的对比,我们先看下没有使用debounce技术的click事件:

6f44c35a3a9dd7a06a725d6c9df0e95b.gif

我们看到,当用户频繁点击button按钮时,控制台会频繁的输出结果,这种频繁调用事件处理程序,会加重浏览器的负担,导致用户体验非常糟糕。

为了解决上述问题,我们在编码中可以使用debounce防抖技术。

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

function debounce(fn, delay) {
var timer = null;
return function() {
// 清除已存在的定时器
timer && clearTimeout(timer)
timer = setTimeout(function() {
fn.apply(this)
}, delay)
}
}
let $btn = document.getElementById('btn');
var fn = function() {
console.log ('防抖旨在时间段内只触发最后一次执行' + new Date(Date.now()));
}
$btn.onclick = debounce(fn, 1000);
如下图,持续触发click事件时,并不会每次触发都会执行事件处理函数,当在设置的周期1000 ms内没有再触发click事件时,才会延时触发click事件。

87e006162d31c6a659475e519abf4ab7.gif

节流(throttle)

函数节流(throttle):函数执行一次后,只有在大于设置的执行周期后才会执行第二次。持续触发事件时,保证一定时间段内只调用一次事件处理函数。

throttle翻译为节流阀,我们可以想象成我们水龙头放水,阀门一打开,水哗哗的往下流,秉着勤俭节约的优良传统美德,我们要把水龙头关小点,最好是如我们心意按照一定规律在某个时间间隔内一滴一滴的往下滴。

同样我们先看一个没有使用throttle技术的scroll事件,如下图:

eeedd6b740b44caada47bc135454eb21.gif

这种频繁的scroll操作都会给浏览器带来沉重的负担,接下来我们看下如何使用throttle技术。

节流原理:是记录上次执行的时间戳lastTime,每次触发事件时记录当前执行的时间戳nowTime,然后判断nowTimelastTime差值是否大于设定的周期delay,如果大于,则执行回调,并更新上次执行的时间戳,从而循环。持续触发事件时,保证一定时间段内触发事件处理函数的频率。

function throttle(fn, delay) {
// 记录上次触发的时间戳
var lastTime = 0;
return function() {
// 记录当前触发的时间戳
var nowTime = Date.now();
// 如果当前触发与上次触发的时间差值 大于 设置的周期则允许执行
if (nowTime - lastTime > delay) {
fn.call(this);
// 更新时间戳
lastTime = nowTime;
}
}
}
document.onscroll = function () {
console.log ('节流旨在时间段内控制触发的频率'+new Date(Date.now()))
}
如下图,持续触发scroll事件时,并不立即执行处理函数,当当前触发与上次触发的时间差值大于设置的周期时才会执行。

ad659ddd69e9d8586d33504d5e4006dd.gif

应用场景

上面介绍了防抖(debounce) 和 节流(throttle) 的原理和实现方式。

下面简单列出两者的应用场景都有哪些:

防抖(debounce)应用场景:

  • 每个调整大小/滚动都会触发统计事件。

  • 验证文本输入(在连续文本输入后,发送Ajax请求进行验证)。

  • 监视滚动scroll事件(在添加去抖动后滚动,只有在用户停止滚动后才会确定它是否已到达页面底部)。

节流(throttle)应用场景:

  • 实现DOM元素的拖放功能mousemove

  • 搜索关联keyup

  • 计算鼠标移动距离mousemove

  • 画布模拟草图功能mousemove

  • 射击游戏中的 mousedown/keydown事件(每单位时间只能发射一颗子弹)。

  • 监视滚动scroll事件(添加节流后,只要滚动页面,就会每隔一段时间才会计算)。

最后,节流(throttle)旨在时间段内控制触发的频率;防抖(debounce)旨在时间段内只触发最后一次。

近期不要再问我跨域的问题了 | 原理剖析Webpack 5 发布,Chrome 86 支持本地文件系统若此文有用,何不素质三连❤️




推荐阅读
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 一、什么是闭包?有什么作用什么是闭包闭包是定义在一个函数内部的函数,它可以访问父级函数的内部变量。当一个闭包被创建时,会关联一个作用域—— ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了使用FormData对象上传文件同时附带其他参数的方法。通过创建一个表单,将文件和参数添加到FormData对象中,然后使用ajax发送POST请求进行文件上传。在发送请求时,需要设置processData为false,告诉jquery不要处理发送的数据;同时设置contentType为false,告诉jquery不要设置content-Type请求头。 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • ASP.NET&Spring.NET&NHibernate最佳实践(五)——第3章人事子系统(2)
    3.4.人事子系统服务层(Service)部门服务接口(IDeptService.cs)usingSystem;usingGuushuuse.SalaryPrj. ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
  • 巧用arguments在Javascript的函数中有个名为arguments的类数组对象。它看起来是那么的诡异而且名不经传,但众多的Javascript库都使用着它强大的功能。所 ... [详细]
  • python+selenium十:基于原生selenium的二次封装fromseleniumimportwebdriverfromselenium.webdriv ... [详细]
author-avatar
QQ文科
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有