zoukankan      html  css  js  c++  java
  • 关于Js debounce(防抖)函数和throttle(节流)小结

    闭包的实际运用防抖
    
    防抖:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,
    如果设定的时间到来之前,又一次触发了事件,就重新开始 延时。
    (如果在一段时间内,又触发了该事件;就重新开始 延时)
    主要运用
    1==>在用户输入
    2==> 用户不断的点击按钮
    3==>射击游戏中的mousedown、keydown事件
    4==>搜索,结束后n秒后才进行搜索;n秒内,又输入就重新计时
    5==>echarts的resize函数的底层就有防抖
    节流:在规定时间内,保证执行一次该函数。
    

    将函数调用赋值给变量;此时函数已经执行了一次哈

    你认为test函数有没有被执行
       <script>
            function test() {
                console.log('我是被执行了一次的');
            }
            let aa = test(); 
        </script>
    
    已经执行了
    //将函数调用赋值给变量;此时函数已经执行了一次哈
    
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    
    <body>
        <input type="text" id="input">
        <script>
            function debounce(func, delay) {
                console.log(1)
                let timer;
                return function (args) {
                    clearInterval(timer);
                    timer = setTimeout(function () {
                        // 在delay秒内执行某一个func事件;
                        func(args)
                    }, delay)
                }
            }
    
            function inputFunction(val) {
                console.log(`你输出的结束是${val}`);
            }
    
            //此时的防抖函数已经被执行过一次了;在赋值的过程中;
            const debouceInput = debounce(inputFunction, 500);
    
    
            const input = document.getElementById("input");
            input.addEventListener('keyup', function (e) {
                debouceInput(e.target.value)
            })
        </script>
    </body>
    
    </html>
    
      节流:
        当持续触发事件的时候,
        保证在一段时间内,只调用一次事件处理函数;
        点击王者荣耀回城的时候,就需要使用节流哈~
    
        典型就是:
        鼠标不断点击触发;规定在n秒内多次点击只有一次生效
    
    <button id="btn">点击我</button>
        <script>
            function throttle(func, awit) {
                console.log("在赋值的饿时候我就会被触发")
                let timerOut;
                return function () {
                    // 第一次的时候,timerOut是undefined;
                    if (!timerOut) {
                        timerOut = setTimeout(function () {
                            // 当这件事情,做完后,马上设置为null或者undefined;目的:让下次可以进入这个函数
                            timerOut = null;
                            func();
                        }, awit)
                    }
                }
            }
    
            function say() {
                console.log("123")
            }
    
            document.getElementById("btn").onclick = throttle(say, 2000)
    
    
  • 相关阅读:
    终于回来了&&邮递员送信
    发射站
    黑匣子
    利维坦——(1)
    预告
    整除(水题)
    BZOJ054_移动玩具_KEY
    BZOJ4034_树上操作_KEY
    树链剖分学习&BZOJ1036
    BZOJ1208_宠物收养所_KEY
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/13789069.html
Copyright © 2011-2022 走看看