美文网首页Web前端之路让前端飞Web 前端开发
什么是防抖和节流?有什么区别?如何实现?

什么是防抖和节流?有什么区别?如何实现?

作者: 青山旁小溪边 | 来源:发表于2019-10-30 17:30 被阅读0次

问题

什么是防抖和节流?有什么区别?如何实现?

  1. 防抖

触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间

  • 思路

每次触发事件时都取消之前的延时调用方法

<!--
 * @Description: 防抖
 * @Author: Jasper
 * @Github: https://github.com/yuanxinfeng
 * @Date: 2019-10-30 16:25:35
 * @LastEditors: Jasper
 * @LastEditTime: 2019-10-30 16:55:01
 -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>test</title>
  </head>
  <body>
    <input type="text" id="ipt" />
    <ul id="sy"></ul>
  </body>
  <script>
    let arr = new Array();
    let index = 0;
    let ipt = document.getElementById("ipt");
    function debounce(_func_) {
      // 创建一个标记用来存放定时器的返回值
      let timeOut = null;
      return function() {
        // 每当用户输入的时候把前一个 setTimeout clear 掉
        clearTimeout(timeOut);
        // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 _func_ 函数
        setTimeout(() => {
          _func_.apply(this, arguments);
        }, 300);
      };
    }
    function sayHi() {
      index++;
      console.log(`防抖成功${index}!!!`);
      arr.push(`防抖成功${index}!!!`);
      if (!ipt.value) clear();
      sy();
    }
    function clear() {
      arr = [];
    }
    function sy() {
      let str = "";
      arr.map((n, i) => {
        str += `<li>${n}</li>`;
      });
      document.getElementById("sy").innerHTML = str;
    }
    ipt.addEventListener("input", debounce(sayHi));
  </script>
</html>

例子

  1. 节流

高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率

  • 思路

每次触发事件时都判断当前是否有等待执行的延时函数

<!--
 * @Description: 节流
 * @Author: Jasper
 * @Github: https://github.com/yuanxinfeng
 * @Date: 2019-10-30 17:01:25
 * @LastEditors: Jasper
 * @LastEditTime: 2019-10-30 17:28:55
 -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>throttle</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      div{
       padding: 10px;
       margin: 10px;
      }
    </style>
  </head>
  <body>
   <div>
     <h1>宽:</h1>
     <input type="text" id="cw" />
     <h1>高:</h1>
     <input type="text" id="ch" />
   </div>
  </body>
  <script>
    let cw = document.getElementById("cw");
    let ch = document.getElementById("ch");
    cw.value = document.body.clientWidth;
    ch.value = document.body.clientHeight;
    function throttle(_func_) {
      let run = true;
      return function() {
        if (!run) return;
        run = false;
        setTimeout(() => {
          _func_.apply(this, arguments);
          run = true;
        }, 300);
      };
    }
    function sayHi(e) {
      cw.value = e.target.innerWidth;
      ch.value = e.target.innerHeight;
      console.log(e.target.innerWidth, e.target.innerHeight);
    }
    window.addEventListener("resize", throttle(sayHi));
  </script>
</html>

例子
自己可以贴下来跑一下

相关文章

网友评论

    本文标题:什么是防抖和节流?有什么区别?如何实现?

    本文链接:https://www.haomeiwen.com/subject/qpzovctx.html