• JavaScript实现防抖节流函数


    review

    防抖函数

    防抖函数一般是短时间内多次触发,但是只有最后一次触发结束后的delay秒内会去执行相对应的处理函数。
    相当于一个赛道里面一次只能跑一辆赛车,如果此时已经有一辆赛车在跑道里面跑,但是又进来了一辆,那么之前那一辆赛车就会被清空。知道有一辆赛车到达终点,然后执行函数。
    也就是说,防抖函数多次触发,但是一段时间内触发的n次,最后只能有一次会执行。

    节流函数

    节流函数如果也用赛车的案例来举例,就是说:
    一个赛道里面,如果此时已经有了一辆赛车,那么其他想要进入赛道的赛车就会被阻止,直到前一辆赛车进去以后,才会被允许进入一辆新赛车。
    下面的代码中我实现了两种版本的节流函数:

    1. 第一次触发立即执行(使用时间戳)
    2. 第一次触发,需要等待delay秒之后才执行

    code

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>防抖节流</title>
        <style>
            div {
                 300px;
                height: 300px;
                background: #000;
            }
        </style>
    </head>
    
    <body>
        <input type="text">
        <div></div>
    </body>
    <script>
        const input = document.getElementsByTagName('input')[0];
        input.addEventListener('input', queryD(dosomething, 2000));
    
        function dosomething() {
            console.log('do some thing');
        }
    
        // 防抖函数(触发后delay秒内不能再触发,否则重新计时)
        // 可以应用于需要频繁发送请求的场景下
        function queryD(func, delay) {
            console.log('in query d');
            let time = null
            return function () {
                clearTimeout(time);
                time = setTimeout(func, delay);
            }
        }
    
        //----------------------------------------------------
        const div = document.querySelector('div');
        div.addEventListener('touchmove', cost(dosomething, 500));
        div.addEventListener('touchmove', useDate(dosomething, 500));
        // 节流函数(一段时间内只能发生一次)
        // 第一次执行也需要在delay秒之后
        function cost(func, delay) {
            let time = null;
            return () => {
                if (!time) {
                    time = setTimeout(() => {
                        func();
                        time = null;
                    }, delay);
                }
            }
        }
    
        // 使用date实现节流函数
        // 可以立即执行,下一次执行需要等待delay秒之后
        function useDate(func, delay) {
            let time = new Date().getTime();
            return () => {
                const cur = new Date().getTime();
                if (cur - time > delay) {
                    time = cur;
                    func();
                }
            }
        }
    
    </script>
    
    </html>
    
  • 相关阅读:
    windows下在yii中使用mongodb
    yii框架便利类CVarDumper使用
    64位虚拟机创建注意事项
    C#中的委托和事件
    Attribute
    NuGet安装及使用教程
    WPF+WEB+WinForm->>表现层共用类
    C#报修系统Ⅱ
    C#带小括号的运算
    工厂模式提供数据源
  • 原文地址:https://www.cnblogs.com/azoux/p/15997298.html
Copyright © 2020-2023  润新知