2、防抖与节流

简介: 2、防抖与节流

1、防抖


① 用户触发操作过于频繁,我们只需要最后一次事件操作即可。例如,当我们在输入框中填写数据时,只要值变化,它就会向后台发出请求。只要你不停地输入,它就会不停地发出请求,数据就会发生抖动,容易挤爆内存。所以我们要在一定时间内的请求合并成一个,防止数据抖动,优化性能。


② 解决方法:添加定时器,在最后一次触发事件n秒后发出请求。如果你一直输入数据,它就会清除前一个数据来代替前一个数据,当你停下来不再输入数据时,获取最后一个数据,n秒之后才发出一次请求。


2、节流


  • ① 用户触发事件过于频繁,控制每隔多少秒发生一次。例如,表单提交,用户一直点击提交是不可取的,要在n秒内只能提交一次。
  • ② 解决方案:添加定时器,每隔n秒发出一次请求


3、两者区别


防抖与节流
防抖 只需要最后一次事件操作即可(输入数据)
节流 控制每隔多少秒发生一次事件操作(登陆按钮)



3、防抖函数解析


2c3956f5bdbe4088adbb3f2ba7c6a900.png


4、节流函数解析


b1a3a300c7c74ff7ac653087d450a714.png


5、源代码

<!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, shrink-to-fit=no">
  <title>防抖与节流</title>
  <!-- Bootstrap -->
  <link rel="stylesheet" href="bootstrap/bootstrap.min.css">
</head>
<style>
  body {
    padding: 0px;
    margin: 0px;
  }
  main {
    position: absolute;
    width: 500px;
    /*小矩形处于以左上角为原点的中心位置 */
    top: 50%;
    left: 50%;
    /*让小矩形往左上移动自身长宽的50%*/
    transform: translate(-50%, -50%);
  }
  form .form-group {
    margin-bottom: 10px;
  }
</style>
<body>
  <main class="shadow p-3 mb-5 bg-white rounded">
    <form>
      <div class="form-group">
        <label for="username">Username</label>
        <input type="text" class="form-control" id="username">
      </div>
      <div class="form-group">
        <label for="password">Password</label>
        <input type="password" class="form-control" id="password">
      </div>
      <button class="btn btn-primary" type="button">Submit</button>
    </form>
  </main>
  <!-- Bootstrap -->
  <script src="bootstrap/jquery.min.js"></script>
  <script src="bootstrap/bootstrap.min.js"></script>
</body>
<script>
  //  1、防抖:用户触发事件过于频繁,只需要最后一次事件的操作
  let dataInput = document.querySelector('input');
  dataInput.oninput = antiShake(function () {
    console.log(this.value);
  }, 2000);
  //  2、封装防抖
  function antiShake(fn, wait) {
    let timeOut = null;
    return function () {
      if (timeOut) clearTimeout(timeOut);
      //  用call把this指针指向input
      timeOut = setTimeout(() => { fn.call(this); }, wait);
    }
  }
  //  3、节流:用户触发事件过于频繁,控制每隔多少秒发生一次;例如,表单提交
  let submit = document.querySelector('button');
  let click = true;
  submit.onclick = throttle(function () {
    console.log('hello world');
    click = true;
  }, 2000);
  //  4、封装节流
  function throttle(fn, wait) {
    return function () {
      if (click) {
        setTimeout(() => {
          fn();
        }, wait)
      }
      click = false;
    }
  }
</script>
</html>


相关文章
节流
【10月更文挑战第17天】
|
6月前
节流、防抖
节流、防抖
44 2
|
6月前
|
前端开发 UED
关于防抖和节流的理解
防抖和节流是前端开发中常用的两种性能优化技术。
37 0
防抖&节流
防抖&节流
117 0
什么是防抖和节流,怎么实现一个防抖和节流?
功能:当事件被触发N秒之后再执行回调,如果在N秒内被触发,则重新计时。
|
JavaScript 前端开发
节流与防抖
节流与防抖
51 0
|
JavaScript 前端开发
什么是防抖和节流?如何实现防抖和节流?
防抖(debounce)和节流(throttle)是 JavaScript 中常用的两种性能优化方法。
|
前端开发 JavaScript
关于防抖和节流我所知道的
关于防抖和节流我所知道的
60 0