JS的防抖和节流

2020-12-02  本文已影响0人  一名有马甲线的程序媛

防抖(JS的事件多次触发,只执行最后一次)

应用场景: input输入信息进行搜索,如果每敲一个字符就请求后台接口,给后台的压力太大了,所以做好防抖,即让程序只执行最后一次的事件。
为解决该问题,探索到了两个解决方案:

  <input type="text">

  <script>
    let inp = document.querySelector('input');

    inp.oninput = debounce(function() {
      console.log(this.value);  // 业务都在这里
    }, 500)

    function debounce(fn,delay) {
      let t = null;
      return function(){
        if (t!= null) {
          clearTimeout(t)
        }
        t = setTimeout(() => {
          // 这里注意 不能直接是fn() 因为this指向是window
          fn.call(this)
        }, delay)
      }
    }
  </script>

直接使用lodash工具库的debounce方法
参考网址:https://blog.csdn.net/qq_39139322/article/details/103295326

节流(控制高频事件执行次数)

应用场景: 滚轮滚动触发事件频繁,加上延迟可低频触发
看过了上面闭包防抖的写法,下面闭包节流的写法也很好理解了~

window.onscroll = throttle(function() {
      console.log('hello world');
    }, 500)
    function throttle (fn, delay) {
      let flag = true;
      return function () {
        if (flag) {
          setTimeout(() => {
            fn.call(this)
            flag = true
          },delay)
        }
        flag = false
      }
    }
上一篇下一篇

猜你喜欢

热点阅读