首页 > 其他分享 >防抖 & 节流

防抖 & 节流

时间:2022-11-29 10:48:17浏览次数:36  
标签:function 触发 防抖 节流 args delay callback

防抖 & 节流


防抖: 连续触发事件,但在规定时间内,只会触发一次

详细解说:规定时间为2000ms,在这个时间内,如果多次触发事件,会终止上一次没有执行完的操作,重新开始计时,最终也只会执行一次。

/**
 * 防抖,取消上一次没有完成的操作,并重新开始计时
 * @param {Function} callback 事件监听回调
 * @param {Number} delay 延迟时间
 * @returns 返回一个函数,函数内部的 this 指向事件调用者
 */
function antiShake(callback, delay) {
    let timer;
    return function (...args) {
        // 1.如果定时器存在则清除此定时器
        if (timer) clearTimeout(timer);
        // 2.重新开启一个定时器
        timer = setTimeout(() => {
            // 3.改变函数 callback 的 this 指向
            callback.apply(this, args)
        }, delay);
    }
}
const but = document.querySelector('button');
but.addEventListener("click", antiShake(function (e) {
    console.log(e);
}, 2000));

节流:连续触发事件,但在规定时间内,也只会触发一次。与防抖的区别在于,节流并不会重新计时。

详细解说:规定时间为2000ms,在这个时间内,如果多次触发事件,只有第一次触发视作生效,后续的触发都视作无效。类似于游戏中的技能冷却,从第一次释放开始计时,在计时期间再次操作都视为无效操作。

/**
 * 节流,一段时间内只执行第一次操作
 * @param {Function} callback 事件监听回调
 * @param {Number} delay 延迟时间
 * @returns 返回一个函数,函数内部的 this 指向事件调用者
 */

// 1.使用标记法
function throttle(callback, delay) {
    let flag = true
    return function (...args) {
        if (!flag) return;
        flag = false;
        setTimeout(() => {
            callback.apply(this, args)
            flag = true;
        }, delay);
    }
}

// 2.当前事件触发时的时间戳 减去 上一次有效触发的时间戳来进行判断
function throttle(callback, delay) {
    let flagTime = 0
    return function (...args) {
        const now = Date.now()
        if (now - flagTime > delay) {
            flagTime = now
            setTimeout(() => {
                callback.apply(this, args)
            }, delay);
        }
    }
}

标签:function,触发,防抖,节流,args,delay,callback
From: https://www.cnblogs.com/afc7777/p/16934642.html

相关文章

  • 节流和防抖的实现
    节流的理解和简单实现所谓的“节流”,是通过在一段时间内无视后来产生的回调请求来实现的。只要一位客人叫了车,司机就会为他开启计时器,一定的时间内,后面需要乘车的客人都得......
  • vue 2 中防抖节流在当前页面里写
    isfilter(val){   //过滤   this.debounce(()=>{    this.init(val);   },1000);  },  debounce(fn,delay){   v......
  • React-Hooks怎样封装防抖和节流-面试真题
    Debouncedebounce原意消除抖动,对于事件触发频繁的场景,只有最后由程序控制的事件是有效的。防抖函数,我们需要做的是在一件事触发的时候设置一个定时器使事件延迟发生,在......
  • 前端防抖节流
    /***防抖核心代码*逻辑是*第一次点完以后开始计时*如果单位时间内点了的话*不但无效,而且时间从头计算**例如*设置3000毫秒*第一次点完如果3秒......
  • vue2中请求函数防抖处理
    ......
  • 53 .节流和防抖
        节流的使用场景:登录按钮防抖的使用场景:搜索框搜索......
  • 防抖与节流
    防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案。在给DOM绑定事件时,有些事件我们是无法控制触发频率的。如鼠标移动事件onmousemove,滚动滚动条事件onscrol......
  • java--IO流 ☞ 字节流
    IO流概述和分类IO流介绍IO:输入/输出(Input/Output)流:是一种抽象概念,是对数据传输的总称,流的本质是数据传输IO流就是用来处理设备间数据传输问题的。常见的应......
  • 如何理解面向字节流和面向报文
    如何理解面向字节流和面向报文今天看TCP和UDP的区别,发现很多文章讲到TCP是面向字节流,UDP是面向报文的,好奇查了查,这里做个总结为什么UDP是面向报文的协议用户通过UDP......
  • java 字节流写入
    packagecom.tedu.day1201;importjava.io.File;importjava.io.FileOutputStream;publicclassStudy_Fos{publicstaticvoidmain(String[]args){......