javascript

javascript中的防抖与节流

2021-12-12  本文已影响0人  听书先生
1、函数防抖

在事件被触发设定的秒数之后再去执行回调函数,且在一定的时间内反复触发的话会进行重新计时。
函数防抖的优势主要用于交互层,最常见的是动态搜索框,如果不做防抖处理会不断的向服务器去查询数据,而最好的解决办法是让用户停止输入的时候再去进行查询搜索。
示例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>

<body>
    <input type="text" id="input">
    <script>
        let ele = document.getElementById('input');

        function ajax(content) {
            console.log('send  ' + content)
        }

        function debounce(fun, delay) {
            return function (args) {
                let that = this
                let _args = args
                clearTimeout(fun.id)
                fun.id = setTimeout(function () {
                    fun.call(that, _args)
                }, delay)
            }
        }

        let fun = debounce(ajax, 500)

        ele.addEventListener('keyup', function (e) {
            fun(e.target.value);
        })
    </script>
</body>

</html>

2、函数节流

函数节流指的是在一定的单位时间内,只能触发一次函数,如果一定时间内触发多次,只有一次生效。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title></title>
</head>

<body>
    <input type="text" id="input">
    <script>
        let ele = document.getElementById('input');

        function sendMsg(content) {
            console.log('send ',content);
        }

        // 简单的`throttle`函数实现
        var throttle = function (func, wait) {
            var lastTime = 0 // 用来记录上次执行的时刻
            // 返回包装过的throttle函数
            return function (...args) {
                var now = Date.now()

                var coolingDown = now - lastTime < wait;
                if (coolingDown) {
                    return
                }
                // 记录本次执行的时刻
                lastTime = Date.now()
                func.apply(null, args)
            }
        }

        var fun = throttle(sendMsg,2000);


        ele.addEventListener('keyup', function (e) {
            fun(e.target.value)
        })
    </script>
</body>

</html>
3、区别
4、应用情景
上一篇 下一篇

猜你喜欢

热点阅读