js防抖与节流(附代码)

1. 防抖

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

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

<!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>Document</title>
</head>

<body>
    <input type="text" id="inp" placeholder="测试输入防抖">
    <button id="btn">测试点击防抖</button>
</body>

</html>

<script>
    function debounce(fn) {
        let timeout = null; // 创建一个标记用来存放定时器的返回值
        return function () {
            clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉
            timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数
                fn.apply(this, arguments);
            }, 500);
        };
    }

    function sayHi() {
        console.log('防抖成功');
    }

    var inp = document.getElementById('inp');
    var btn = document.getElementById('btn');
    inp.addEventListener('input', debounce(sayHi)); // 防抖
    btn.addEventListener('click', debounce(sayHi)); // 防抖
</script>

2. 节流

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

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

<!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>Document</title>
</head>

<body>
    <input type="text" id="inp" placeholder="测试输入节流">
    <button id="btn">测试点击节流</button>
</body>

</html>

<script>
    function throttle(fn) {
      let canRun = true; // 通过闭包保存一个标记
      return function () {
        if (!canRun) return; // 在函数开头判断标记是否为true,不为true则return
        canRun = false; // 立即设置为false
        setTimeout(() => { // 将外部传入的函数的执行放在setTimeout中
          fn.apply(this, arguments);
          // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。当定时器没有执行的时候标记永远是false,在开头被return掉
          canRun = true;
        }, 500);
      };
    }
    function sayHi(e) {
      console.log('节流成功');
    }
    var inp = document.getElementById('inp');
    var btn = document.getElementById('btn');
    inp.addEventListener('input', throttle(sayHi)); // 防抖
    btn.addEventListener('click', throttle(sayHi)); // 防抖
</script>

你可能感兴趣的:(web前端)