防抖和节流

文章目录

防抖

事件发生后,n秒只触发一次,若在n秒内再次触发,则重新计算。

第一类:先延时再执行 【延时可以重新计算】

只要在每次执行事件前,先清除定时器,再开启一个定时器即可

第二类:先执行后延时 【延时可以重新计算】

需要借助一个变量来存储当前的定时器的状态,通过不同的状态,来执行不同的事件

  function handle(fn, delay) {
            var timer = null
            return function() {     //必须形成闭包
                clearTimeout(timer)   //先清空上一次的
                timer = setTimeout(function() {  //必须用函数包裹
                    fn()   
                }, delay)
           }
        }
        document.querySelector("button").onclick = handle(function() {
            console.log("带你寄了")
        }, 2000)

节流

事件发生后,n秒只能触发一次。

先设一个定时器句柄(let time)
只写定时器没有的情况,在里面添加一个定时器,并调用相关事件

当无法使用定时器时,使用时间戳(时间间隔),同样可以实现类似效果

function setInt(fn, delay) { //fn就是要被截留的函数
    var oldtime = 0

    return function callBack() {  //使用闭包,才能保存上次的时间

        var newtime = Date.now()
        if (newtime - oldtime > delay) {
            fn()
            oldtime = newtime
        }
    }
}
document.onscroll = setInt(function() {  //滚动时触发
    console.log("hello")
}, 200)
上一篇:js防抖与节流


下一篇:Rabbitmq 定时任务