zoukankan      html  css  js  c++  java
  • JS 抖动和节流

    节流:周期性的执行,比如就是 每隔10秒执行一次,每隔10秒执行一次,主要就是用当前的时间减去上一次触发的时间,判断是否大于等于要执行的间隔时间,如果是就执行,不是就不执行。(注意:最后一次按键事件可能出现小于间隔时间的情况,可以给最后一次按键事件使用setTimeOut来延迟事件的触发);

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>节流</title>
    </head>
    <body>
        <label for="jie">节流</label><input type="text" name="jie" id="demo">
        <script>
            // 节流:当发生滚动条滚动的时候,这种连续不断的是键触发的时候,规定在一定的周期内,才执行一次,而不是一只执行,周期性的执行
            var text = document.getElementById("demo");
            // text.addEventListener('keyup',function(){
            //     //未进行节流,只要按键就会触发事件然后一直执行
            //     console.log(text.value);
            // });
            
            //进行节流
            //要执行的事件
            function ajax(element){
                console.log(element.value);
            }
            //节流,对func方法进行节流,执行的周期事件是delay
            function throttle(func,delay){
                let timer;
                let last;//上一次执行事件的时间
                return function (args){
                   let now = new Date();//当前时间
                   if(!last){
                       func(args)
                       last = now;
                   }else{
                        if(now-last>=delay){
                            //当上一次的执行事件和现在时间差大于延迟时间就立即执行
                            func(args);
                            last = now;
                        }else{
                            //主要是为了处理在小于延迟事件内的触发事件
                            clearTimeout(timer);
                            //最后一次按键事件
                            //当最后一次 可能会出现 当前时间减上一次时间小于delay,也就是说 可能到了最后的时候,不会执行函数,也就无法获取到完整的数据,
                            //所以,对最后一次触发事件进行延迟,延迟一个周期就可以了
                            timer = setTimeout(function(){
                                func(args);
                               // last = now;
                            },delay);
    
                        }
                   }
                  
                    
                }
            }
            var demo = throttle(ajax,1000);
            //监听事件
            text.addEventListener('keyup',function(){
                //执行事件
                demo(text);
                
            })
        </script>
    </body>
    </html>

    抖动:键入之后在指定的延迟时间之后执行触发事件,当下一次再次键入的时候,如果是在上一次键入的延迟时间内,就将时间重新设置,重新从当前键入的时间来设置延迟事件,

    如此的话,触发事件只能是在最后一次键入的时候,或则是两次键入的事件之差大于延迟时间,才会执行触发事件。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>防抖动</title>
    </head>
    <body>
        <input type="text" name="" id="text">
        <script>
            function ajax(element){
                console.log(element.value);
            }
            function debounce(func,delay){
                let timer;
                return function (args){
                    let now = new Date();
                    clearTimeout(timer);
                    timer = setTimeout(function(){
                        func(args);
                    },delay)
    
                }
            }
            const text = document.getElementById("text");
            var demo = debounce(ajax,1000);
            text.addEventListener('keyup',function(){
                //节流就是,当上一次触发了之后,延迟指定的时间执行相关操作,但是如果在这延迟时间内又触发了事件,则需要将时间归0,从新开始延迟
                //由于一直在重重新开始计时,也就是最后一次键入的时候才能真正的有效,或则说是超过延迟时间再键入的情况下才能执行
                demo(text);
            },false);
        </script>
    </body>
    </html>

    来源:https://juejin.im/post/5b8de829f265da43623c4261#comment

  • 相关阅读:
    Linux--sed使用
    header函数的用法
    php的cli命令行接口
    extract函数在表单提交中提供的方便之处
    sersync实时同步备份的安装
    Centos7 服务器异常处理
    MySQL之——崩溃-修复损坏的innodb:innodb_force_recovery
    记一次oracle内存分配不足,前端访问500报错,如何扩容oracle的memory_target内存
    mysql sql语句整理
    关于控制mysql的binlog日志刷入磁盘频率的参数理解
  • 原文地址:https://www.cnblogs.com/panjingshuang/p/11619968.html
Copyright © 2011-2022 走看看