首页 > 其他分享 >js防抖和节流

js防抖和节流

时间:2023-05-26 09:34:37浏览次数:44  
标签:防抖 throttle 节流 debounce timer js timeout

1. 什么是节流(throttle)和防抖(debounce)

  1. 概念
    • 节流(throttle):是函数在一定时间内,不管调用了多少次,实际只会在最后的时候执行一次
    • 防抖(debounce):是函数在一定时间内,每次调用,都会重置倒计时,直到规定时间内没有再次调用,才会执行
  2. 区别
    这里以关门当作函数执行前等待时间时的操作;以发车继续运行下一步为实际执行函数
    • 节流类似于地铁,在指定时间后,一定会关门发车,不管是否再有人想进来,最终只会执行一次关门发车的行为
    • 防抖类似于电梯,电梯需要在n秒后关门,然后才会运行,但是如果有人中途按下门外按钮,会重置关门这个行为,直到没有人上电梯,才会继续运行。

2. 如何实现节流

function throttle(fn, timeout) {
    let timer = null;

    return function() {
         if(!timer) {
            timer = setTimeout(()=>{
                // 解决this指向和arguments,因为setTimeout和setInterval中的this指向window
                fn.apply(this, arguments);
                timer = null;
            }, timeout);
        }
    }
}
// 使用
const throttledFn = throttle((a, b, c) => console.log(a, b, c), 3000);

3. 如何实现防抖

function debounce(fn, timeout) {
    let timer = null;
    return function () {
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(() => {
            // 解决this指向和arguments,因为setTimeout和setInterval中的this指向window
            fn.apply(this, arguments);
        }, timeout);
    }
}
// 使用
const debouncedFn = debounce((a, b) => console.log(a, b), 2000);

4. CSS版节流

第一种思路:

button{
  animation: throttle 2s step-end forwards;
}
button:active{
  animation: none;
}
@keyframes throttle {
  from {
    pointer-events: none;
  }
  to {
    pointer-events: all;
  }
}

另一种思路:
image

5. 应用场景

  1. 防抖的应用场景:搜索框的输入联想、表单校验,窗口大小调整的回调 等等;
  2. 节流的应用场景:懒加载、滚动加载、加载更多或监听滚动条位置、防止表单重复提交 等等;

标签:防抖,throttle,节流,debounce,timer,js,timeout
From: https://www.cnblogs.com/pangqianjin/p/17433808.html

相关文章

  • Fastjson 很快,但不适合我....
    作者:nyingping来源:juejin.cn/post/7215886869199863869记者:大爷您有什么特长呀?FastJson:我很快。记者:23423乘以4534等于多少?FastJson:等于2343.记者:??FastJson:你就说快不快吧!这个略显马丽苏的标题,各位看官将就着看吧。主要是怕被喷。FastJson真的很好,我用不用我喜不......
  • JS的异步化特征async await
    参考:https://segmentfault.com/a/1190000007535316https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promisehttps://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/awaithttps://developer.mozilla.org/zh-CN/......
  • P4557 [JSOI2018]战争 题解
    闵可夫斯基和前言入门建议看吉老师(吉如一)的计算几何入门到放弃。感觉应该是讲的最通俗易懂的了。本文借鉴了Winxp的博客,以及吉老师视频中的思路。写这篇博客的初衷是因为我作为一个初学者,此题里的题解对我来说理解起来不算太难,但是实现起来细节比较多,题解里也没有很详细地去解......
  • JS constructors
    我们可以这样create一个object:constperson1={name:"Chris",introduceSelf(){console.log(`Hi!I'm${this.name}.`);},};但是当我们需要创建多个对象的时候,每次都要重复同样的code,这时候我们可以用构造函数Abetterwayistousea constructor.Acon......
  • 基于Qt的音乐播放器(三)通过酷狗音乐的api接口,返回json格式歌曲信息(播放地址,歌词,图片)
    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票!我的投票地址:点击为我投票文章目录前言1.获取歌曲搜索列表api接口2.获取单个歌曲详细信息包括歌词3.总结前言首先说明,本教程仅供个人学习,研究使用,禁止用于任何的商业和非法用途。(手动狗头)之所以要研究这个,是因为我想......
  • Oracle中读取JSON格式数据实战指南(oracle中读json)
    Oracle中读取JSON格式数据实战指南 随着大数据、云计算等技术的快速发展,JSON(JavaScriptObjectNotation)格式的数据越来越广泛应用于数据交互和存储中。Oracle数据库支持JSON格式数据的存储和查询,本篇文章将介绍如何在Oracle中读取JSON格式数据,并提供相关代码示例。 1.创建......
  • js \x 反斜杠x 16进制 编解码
    解码functiondecode(str){ returnstr.replace(/\\x(\w{2})/g,function(_,$1){returnString.fromCharCode(parseInt($1,16))});}编码functionencode(str){returnstr.replace(/(\w)/g,function(_,$1){return"\\x"+$1.charCodeAt(0).toString(16)......
  • JS 树形数据 Tree的通用方法
    点击查看代码/***@description查找包含自身节点的父代节点*@paramlist列表数据*@paramid节点id*@parampid节点的父id*/exportfunctionlistToTree(list,id,pid){list.forEach((node)=>{constpNdoe=list.find((row)=>row[id]===nod......
  • jquery/js 根据下拉框选择的值进行按钮展示
    学习如逆水行舟,不进则退~最近接了一个n年前的老项目增加新功能,本以为手到擒来结果再写页面上的效果时还是翻车了,特此记录一下~ 将近三四年没写jsp的页面了,基本忘光了,现在是要做一个批量下载的功能,但是又要是特定的某一个才有这个功能所以就有了以下的过程。一、实现效果......
  • js基础之Promise详解
    1.是什么Promise是一种异步编程的解决方案,用于处理异步操作并返回结果。主要作用是解决回调函数嵌套(回调地狱)的问题,使异步操作更加清晰、易于理解和维护。2.怎么用Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。当一个Promise被创建时,它的状态为pendin......