js防抖和节流

防抖

概念
  • 标题在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。
防抖:<input type="text" name="" id="deb">
<script>
    function debounce(fn, wait) {
        var timeout = null;
        return function (arg) {
            if (timeout !== null) {
                clearTimeout(timeout);
            }
            timeout = setTimeout(function () {
                fn(arg);
            }, wait);
        }
    }
    // 处理函数
    function handle(arg) {
        console.log(arg);
    }

    let inputb = document.getElementById('deb');
    let d = debounce(handle, 1000);// 要单独拿出来 不能放进事件绑定里
    //事件
    inputb.addEventListener('keyup', function () {
        d(inputb.value);
    });
</script>

或者

function handle(content) {
    console.log(content)
}

function debounce(fun, delay) {
    return function (args) {
        let that = this
        let _args = args
        clearTimeout(fun.id)
        fun.id = setTimeout(function () {
            fun.call(that, _args)
        }, delay)
    }
}

let inputb = document.getElementById('deb')

let d = debounce(handle, 500)

inputb.addEventListener('keyup', function (e) {
    d(e.target.value)
})

节流

概念
  • 规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。
应用场景
  • 防止表单多次提交
function throttle(func, delay) {
    var prev = Date.now();
    return function () {
      var context = this;
      var args = arguments;
      var now = Date.now();
      if (now - prev >= delay) {
        func.apply(context, args);
        prev = Date.now();
      }
    }
  }

  function handle() {
    console.log(Math.random());
  }
  window.addEventListener('scroll', throttle(handle, 3000));

上面是网上找的,自己有点笨看了挺久才看懂,context 是为了保存执行环境的 thisargs作传值用,只是上面的代码没用到传值,修改一下,感觉容易懂一点

    function throttle(func, delay) {
      var prev = Date.now();
      return function () {
        var now = Date.now();
        if (now - prev >= delay) {
          func();
          prev = Date.now();
        }
      }
    }

    function handle() {
      console.log(1);
    }

    setInterval(throttle(handle, 2000),10);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值