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

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     7     <title>Document</title>
     8 </head>
     9 <body>
    10     <button id="btn">定时器</button>
    11 </body>
    12 <script src="../js/debounce2.js"></script>
    13 </html>
    debounce2.js
     1 /*
     2    函数的防抖(防止老年帕金森):对于频繁触发某个操作,我们只识别一次(只触发执行一次函数)
     3    @params
     4       func[function]:最后要触发执行的函数
     5       wait[number]:"频繁"设定的界限
     6       immediate[boolean]:默认多次操作,我们识别的是最后一次,但是immediate=true,让其识别第一次
     7    @return 
     8      可以被调用执行的函数
     9 
    10    主体思路:在当前点击完成后,我们等wait这么长的时间,看是否还会触发第二次,如果没有触发第二次
    11    属于非频繁操作,我们直接执行想要的执行的函数func,如果触发了第二次,则以前的不算了,从当前这
    12    次在开始等待.....
    13 */
    14 function debounce(func, wait = 300, immediate = false) {
    15   var timer = null;
    16   return function anonymous(...params) {
    17     let now = immediate && !timer;
    18 
    19     //每次点击都把设置的定时器清除
    20     clearTimeout(timer);
    21 
    22     //重新设置一个新的定时器监听wait时间内是否触发第二次
    23     timer = setTimeout(() => {
    24       //手动让其回归到初始状态
    25       timer = null;
    26 
    27       //wait 这么久的等待中,没有触发第二次
    28       !immediate ? func.call(this, ...params) : null;
    29     }, wait);
    30 
    31     //如果是立即执行
    32     now ? func.call(this, ...params) : null;
    33   };
    34 }
    35 
    36 /*
    37 函数节流:在一段频繁的操作中,可以触发多次,但是触发的频率由自己决定 
    38    @params
    39       func[function]:最后要触发执行的函数
    40       wait[number]:"频繁"设定的界限
    41    @return 
    42      可以被调用执行的函数 
    43 */
    44 
    45 //节流1
    46 function throttle(func, wait = 300) {
    47   let timer = null,
    48     previous = 0; //记录上一次的操作时间
    49   return function anonymous(...params) {
    50     let now = new Date(),
    51       remaining = wait - (now - previous); //记录还差多久达到我们一次触发的频率
    52     if (remaining <= 0) {
    53       //两次操作的时间间隔超过wait了
    54       clearTimeout(timer);
    55       timer = null;
    56       previous = now;
    57       func.call(this, ...params);
    58     } else if (!timer) {
    59       //两次操作的时间还不符合触发的频率
    60       timer = setTimeout(() => {
    61         timer = null;
    62         previous = new Date();
    63         func.call(this, ...params);
    64       }, remaining);
    65     }
    66   };
    67 }
    68 
    69 //节流2
    70 function throttle2(func, wait=300) {
    71     var begin = 0;
    72     return function () {
    73         var cur = new Date().getTime();
    74         if (cur - begin > wait) {
    75             func.apply(this, arguments)
    76             begin = cur;
    77         }
    78     }
    79 }
    80 
    81 function fun() {
    82   console.log("定时器执行");
    83 }
    84 
    85 btn.onclick = throttle(fun, 1000);
     
  • 相关阅读:
    微信小程序wx:key以及wx:key=" *this"详解:
    JavaScript实现按照指定长度为数字前面补零输出的方法
    多行文字溢出点点点的3中实现方法
    C#多态“说来也说”——逻辑层BLL中的多态使用
    .NET文件并发与RabbitMQ(初探RabbitMQ)
    StackExchange.Redis客户端读写主从配置,以及哨兵配置。
    RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用
    StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)
    StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)
    StackExchange.Redis帮助类解决方案RedisRepository封装(基础配置)
  • 原文地址:https://www.cnblogs.com/joyco773/p/14727213.html
Copyright © 2011-2022 走看看