节流与防抖

94 阅读1分钟

节流与防抖

作用

防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案。 在给 DOM 绑定事件时,有些事件我们是无法控制触发频率的。 如:

  • 鼠标移动事件 onmousemove,
  • 滚动滚动条事件 onscroll,
  • 窗口大小改变事件 onresize,
  • 瞬间的操作都会导致这些事件会被高频触发。
  • 如果事件的回调函数较为复杂,就会导致响应跟不上触发,出现页面卡顿,假死现象
  • 在实时检查输入时,如果我们绑定 onkeyup 事件发请求去服务端检查,用户输入过程中,事件的触发频率也会很高,会导致大量的请求发出,响应速度会大大跟不上触发。

实现方式

节流

  • 一般是onrize,onscroll等这些频繁触发的函数,比如你想获取滚动条的位置,然后执行下一步动作;鼠标不断点击触发,mousedown(单位时间内只触发一次)…
        function fun(fn,timer){
            var flage = false;
            // event 事件对象
            return function(event){
                if(flage) return;
                flage = true;
                setTimeout(function(){
                    fn(event)
                    flage = false;
                },timer)
            }
        }
        function fn(i){
            console.log(i.target.innerWidth,i.target.innerHeight)
        }
        window.addEventListener('resize',fun(fn,2000))

防抖

  • 频繁操作点赞和取消点赞,因此需要获取最后一次操作结果并发送给服务器;search搜索联想,用户在不断输入值时…
        function debounce(fn,timer) {
    var timer=null;
    return function() {
    //保存当前调用的dom对象
     var _this=this;
     //保存事件对象
     var args=arguments;
     clearTimeout(timer)
     timer=setTimeout(function() {
         func.apply(_this,args)
     },wait)
    }

}