js实现 throttle 和 debounce

js实现 throttle 和 debounce1 throttle 节流 drag 改变浏览器大小 触发 onresize 函数 实现拖动每过 1 秒输出一次 不足 1 秒 1 秒后输出一次 多用于高频操作 如抢票 抢购等 无论点击多少次 只固定间隔执行一次 以减轻压力 原理 设置 canRun 作为是否执行的标志 每次触发 onresize 都判断 canRun 的值 true 执行 false 不执行 第一次应该执行 所以设置 canRun 初始值为 true 当第

1、throttle 节流:drag改变浏览器大小,触发onresize函数,实现拖动每过1秒输出一次,不足1秒,1秒后输出一次。多用于高频操作,如抢票、抢购等,无论点击多少次,只固定间隔执行一次,以减轻压力。

原理: 设置canRun作为是否执行的标志。每次触发onresize,都判断canRun的值(true执行,false不执行)。第一次应该执行,所以设置canRun初始值为true。当第一次执行后,设置canRunfalse(防止下次执行),并设置计时器,以恢复canRun的值。

 var canRun = true; window.onresize = function() { if (!canRun){ return; } canRun = false; setTimeout(function() { console.log('节流了'); canRun = true; }, 1000); } 

        好,原理有了,接下来我们封装一个随处可用的函数,"window"只是为了理解。可以删掉:

 window.canRun = true; window.throttle = function(callback, time) { if (!window.canRun) { return; } window.canRun = false; setTimeout(function() { callback(); window.canRun = true; }, time); } // 这样使用: window.onresize = function() { window.throttle(function() { console.log('防抖成功'); // 业务代码 }, 1000); }

 

 

 

 

2、debounce防抖:drag改变浏览器大小,触发onresize函数,实现拖动停顿1秒输出。多用于输入框,当某一次输入后停顿满n秒才会去触发远程搜索。

        原理:timer作为定时器,每次触发onresize事件,都清一下定时器(之前未执行的drag方法就不会再执行),新的定时器在1秒后执行方法,那么如果下次drag1秒内,这次赋值的定时器又会被清掉(搜索方法不会执行),直到下次drag相对于这次drag间隔时间大于1秒(定时器可能没那么准)再执行一次方法onresize

 var timer = false; window.onresize = function() { console.log('1'); clearTimeout(timer); timer = setTimeout(function() { console.log('防抖动'); }, 1000); }

        同样,封装起来使用:

 timer = false; debounce = function(callback, time) { clearTimeout(timer); timer = setTimeout(callback, time); } onresize = function() { debounce(() => {console.log('不抖了');}, 1000); }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224052.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午12:48
下一篇 2026年3月17日 下午12:48


相关推荐

  • socket原理讲解_电感器的作用及原理

    socket原理讲解_电感器的作用及原理1.网络中进程之间如何通信进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIXBSD有:管道(pipe)、命名管道(namedpipe)软中断信号(signal)UNIXsystemV有:消息(message)、共享存储区(sharedmemory)和信号量(semaphore)等.他们都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的相互

    2022年10月10日
    4
  • pycharm2020.3.3使用_pycharm更新python版本

    pycharm2020.3.3使用_pycharm更新python版本PyCharm–》Preferences–》Appearance&Behavior–》systemsetting–》Updates–》去掉勾选即可

    2022年8月26日
    14
  • Java开发人员必须掌握的Linux命令-学以致用(五)

    子曰:“工欲善其事,必先利其器。“做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!学习应该是快乐的,在这个乐园中我努力让自己能用简洁易懂(搞笑有趣)的表达来讲解让知识或者技术,让学习之旅充满乐趣,这就是写博文的初心。今天是周末,首先祝大家周末愉快了,分享一张今天早上去外面拍的照片:图书馆外面的小公园的春意。这周整理了Linux的命令,也被我称为Linux…

    2022年2月28日
    44
  • WINDOWS下安装系统_在Windows环境下

    WINDOWS下安装系统_在Windows环境下PyTorch简介在2017年1月18日,facebook下的Torch7团队宣布PyTorch开源后就引来了剧烈的反响。PyTorch是Torch在Python上的衍生版本。Torch是一个使用Lua语言的神经网络库,Torch很好用,但是Lua流行度不够,所以facebook开发团队将Lua的Torch移植到了更流行的语言Python上,推出了PyTo…

    2026年4月16日
    4
  • 【ElasticSearch面试】10道不得不会的ElasticSearch面试题[通俗易懂]

    【ElasticSearch面试】10道不得不会的ElasticSearch面试题[通俗易懂]以下是ElasticSearch面试题,相信大家都会有种及眼熟又陌生的感觉、看过可能在短暂的面试后又马上忘记了。JavaPub在这里整理这些容易忘记的重点知识及解答,建议收藏,经常温习查阅。评论区见关于es的面试,建议使用名词用官方语言描述会更准确。文章目录1.说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段2.elasticsearch的倒排索引是什么3.elasticsearch是如何实现master选举的5.描述一下Elasticsearch索引

    2025年11月4日
    4
  • oracle存储过程语法

    oracle存储过程语法前两天无意见看见了一个非常适合学习Oracle附上链接:https://blog.csdn.net/yucaifu1989/article/details/15813793Oracle存储过程基本语法存储过程   1CREATEORREPLACEPROCEDURE存储过程名   2IS   3BEGIN   4NULL;   5END; 行1:   CREAT…

    2022年7月17日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号