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);
     
  • 相关阅读:
    mongodb的安装和sql操作
    查看apache和nginx的负载和连接数情况
    ansible中playbook使用
    mysql导入导出命令详解
    生产环境下yum的配置
    firewalld的防火墙
    SOCK5代理服务器
    Linux系统基础优化总结
    服务器内存和缓存的优化
    activemq概念介绍
  • 原文地址:https://www.cnblogs.com/joyco773/p/14727213.html
Copyright © 2011-2022 走看看