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

  • 相关阅读:
    Infopath Notify 弹出提示信息
    window.showModalDialog 返回值
    【转】获得正文内容中的所有img标签的图片路径
    Json Datable Convert
    Sharepoint 列表 附件 小功能
    Surgey 权限更改
    SQL 触发器用于IP记录转换
    Caml语句 查询分配给当前用户及当前组
    jquery 1.3.2 auto referenced when new web application in VSTS2010(DEV10)
    TFS diff/merge configuration
  • 原文地址:https://www.cnblogs.com/panjingshuang/p/11619968.html
Copyright © 2011-2022 走看看