防抖和截流是什么神仙?

防抖:

用户在频繁操作时(在一定时间内),只有最后一次操作时才会触发事件。比如,滑动只有在停止滑动后事件才会触发,否则滑动事件一直被触发。再比如重复点击,也只让最后一次点击事件生效。(怎么判断是最后一次操作,比如停止滑动?——设置事件间隔,在超过时间间隔就视为最后一次操作/停止操作)
直接使用:

var btn = document.getElementById(“demo”)
let timer
btn.onclick=()=>{
clearTimeout(timer)
timer= setTimeout(()=>{
// do sothings
alert(‘haha~重复点击是没有用的!’)
},1000)
}

封装成防抖函数:

function debounce (fn, delay) {
            var timeout
            return () => {
                clearTimeout(timeout)
                timeout = setTimeout(fn, delay)
            }
        }

var btn = document.getElementById("btn")
        function fn1() {
            alert('haha~重复点击是没有用的!')

        }
btn.onclick = debounce(fn1,1000)

节流

在事件触发一次后,在一定时间内不让事件重复触发,也就是在规定时间内,无论你操作几次,到点我才会触发。(另种思路:设置时间段=当前时间-最后操作操作的时间,当时间大于设置的时间我才会被触发)

方法一:——设置固定时间内只发生一次

function throttle(fn,wait){
            let timeout
            return ()=>{
                const context = this
                const args = arguments
                if(!timeout){ 
                 // timeout一开始!timeout为true,所以会执行,再次点击或多次点击时,time在一定时间内(wait值)才会再一次被置为null,之后 if(!timeout)再会被执行
                    timeout = setTimeout(()=>{
                       timeout = null
                       fn.call(context,args) 
                    },wait)
                }
            }
        }
btn.onclick = throttle(fn,1000)

方法二:设置时间戳

function throttle(fn, delay) {
    // 记录上一次函数触发的时间
   let lastTime = 0;
   return()=>{      
       // 记录当前函数触发的时间
      let nowTime = Date.now()
      if (nowTime - lastTime > delay) {
           fn.call(this)  // 指定this指向
           // 重置时间
           lastTime = nowTime
      }   
  }   
}

总结:
同:
防抖和截流都起到了让某个函数不会被任意的、随时触发;
区别:
防抖是在重复操作(比如持续点击)的时候,点击一次就清除一次定时器,然后又加上定时器,只有最后一次操作,才会执行上一次添加的定时器的回调函数;
截流是在定时器回调函数中清除定时器,也就是,在定时器时间内,你进行多少次都与我无关,只有在定时器时间到了我才会再重新启动计时器,因此定时器的回调函数也就不会因为你的重复操作而频发被触发。——设置定时器的思路
设置时间戳的截流方式,是根据上一次和本次操作的时间差来确定是否触事件。-——置时间戳的思路

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值