防抖和节流

防抖或是节流: 限制函数的执行次数

防抖: 通过setTimeout的方式, 在一定时间间隔内,将多次触发变成一次触发
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <input type="text" /> <button value="btn">提交</button>
    <script>
      const inp = document.querySelector("input");
      const btn = document.querySelector("button");

      inp.oninput = debounce(get_value, 1000);
      btn.onclick = debounce1(get_value, 1000);

      function get_value() {
        console.log(this.value);
      }

      // 防抖(多次触发事件之间,间隔delay秒后执行)
      function debounce(fn, delay) {
        let t = null;
        return function () {
          if (t) {
            clearTimeout(t);
          }
          t = setTimeout(() => {
            fn.call(this);
          }, delay);
        };
      }

      // 防抖(先执行第一次,然后多次触发事件,执行delay秒间隔后的第一次)
      function debounce1(fn, delay) {
        let t = null;
        return function () {
          let firstClick = !t;
          if (t) {
            clearTimeout(t);
          }
          if (firstClick) {
            fn.call(this);
          }
          t = setTimeout(() => {
            t = null;
          }, delay);
        };
      }
    </script>
  </body>
</html>
节流: 减少一段时间的触发频率
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <input type="text" /> <button value="btn">提交</button>
    <script>
      const inp = document.querySelector("input");
      const btn = document.querySelector("button");

      btn.onclick = throttle(get_value, 1000);

      function get_value() {
        console.log(this.value);
      }

      // 节流
      function throttle(fn, delay) {
        var begin = 0;
        return function () {
          var current = new Date().getTime();
          if (current - begin > delay) {
            get_value.call(this);
            begin = current;
          }
        };
      }
    </script>
  </body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值