天天看點

防抖和節流

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);