防抖和节流

129 阅读1分钟

防抖和节流

  • 防抖是在操作过程中, 当操作停止时才会进行下一步, 注重的是结果, 例如输入框模糊匹配, 在输入停止后才调用接口
  • 节流是在操作过程中, 按照一定的频率进行操作,注重的是过程 例如拖动元素时会按照设计的节奏一个一个的进行实现

实现防抖

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>防抖</title>
    </head>
    <body>
        <h2>不使用防抖</h2>
        搜索: <input id="input1" />
        <h2>使用防抖</h2>
        搜索: <input id="input2" />

        <script>
            // 防抖
            function debounce(fn, delay = 300) {
                let timer = 0;

                return function () {
                    // 如果存在定时器, 则清零
                    if (timer) clearTimeout(timer);

                    timer = setTimeout(() => {
                        // 绑定this, 绑定额外参数
                        fn.apply(this, arguments);
                        timer = 0;
                    }, delay);
                };
            }

            const input1 = document.getElementById("input1");
            input1.addEventListener(
                "keyup",
                () => {
                    console.log('不使用防抖', input1.value);
                }
            );

            const input2 = document.getElementById("input2");
            input2.addEventListener(
                "keyup",
                debounce(() => {
                    console.log('使用防抖', input2.value);
                })
            );
        </script>
    </body>
</html>

实现效果

debounce.gif

实现节流

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>节流</title>
    </head>
    <body>
        <h2>不使用节流</h2>
        <div id="div1" draggable="true" style="width: 100px; height: 100px; background: red"></div>
        <h2>使用节流</h2>
        <div id="div2" draggable="true" style="width: 100px; height: 100px; background: red"></div>

        <script>
            // 节流
            function throttle(fn, delay = 300) {
                let timer = 0;

                return function () {
                    // 如果存在定时器, 则清零
                    if (timer) return;

                    timer = setTimeout(() => {
                        // 绑定this, 绑定额外参数
                        fn.apply(this, arguments);
                        timer = 0;
                    }, delay);
                };
            }

            const div1 = document.getElementById("div1");
            div1.addEventListener(
                "drag",
                (e) => {
                    console.log('不使用节流', e);
                }
            );

            const div2 = document.getElementById("div2");
            div2.addEventListener(
                "drag",
                throttle((e) => {
                    console.log('使用节流',e);
                })
            );
        </script>
    </body>
</html>

实现效果

throtto.gif