Javascript--防抖与节流

1.防抖

多用于搜索框输入即时发送请求频率控制,可以实现输入停顿指定时间后发送网络请求的功能,无操作n秒后发送请求,遵循的规则是先等待,后执行。

2.节流

多用于解决下拉加载等操作时防止重复操作的需求,第一次操作立即执行,等待n秒后才会继续执行新的操作(等待时间内的操作被忽略),遵循的规则是先执行,后等待。

<!-- 
    防抖 触发后在n秒只执行一次,n秒内再次触发则重新计算
    节流:连续发生的事件n秒只执行一次
-->
<html>

<head>
    <title>防抖与节流·</title>
    <style>
        #countent {
            font-size: 60px;
            text-align: center;
            height: 200px;
             100%;
            background-color: aquamarine;
        }
    </style>
</head>

<body>
    <div id="countent">0</div>
    <script>
        let num = 0;
        let countent = document.getElementById('countent');

        function count() {
            num++;
            countent.innerText = num;
        }

        //防抖:输入后停顿一秒再执行
        function waitTo(func, wait) {
            let timeout;
            return function() {
                //每次触发清除上一个计时器
                clearTimeout(timeout);
                //重新开始计时器
                timeout = setTimeout(function() {
                    //只有计时器维持1s以上没被清除才能执行
                    func.apply(this);
                }, wait);

            }
        }

        //countent.onmousemove = waitTo(count, 500);

        //节流 输入完毕立即执行,2s后才能触发
        //1.计时器实现
        function noWait(func, wait) {
            let timeout = null; //设置初始值
            return function() {//闭包:能够读取其他函数内部变量的函数
                if (!timeout) {
                    func.apply(this);
                    timeout = setTimeout(function() {
                        timeout = null;
                        clearTimeout(timeout);
                    }, wait);
                }
            }
        }
        //2.时间戳实现
        // function noWait(func, wait) {
        //     let pre = 0;
        //     return function() {
        //         let now = Date.now();
        //         if (now - pre > wait) {
        //             func.apply(this);
        //             pre = now;
        //         }
        //     }
        // }
        countent.onmousemove = noWait(count, 1500);
    </script>
</body>

</html>
原文地址:https://www.cnblogs.com/aeipyuan/p/12638624.html