1. 程式人生 > >javaScript 節流與防抖

javaScript 節流與防抖

是否 inf ctype 簡單 ava time handler 網絡請求 ext

首先 我們要知道 節流與防抖可以幹什麽。

優化網絡請求性能——節流

優化頁面請求性能——防抖

舉兩個簡單的小例子:

節流:

技術分享圖片

例如 有些購物頁面,會有一些讓你搶購的活動,到點的時候,需要你快速的點某個按鈕,來搶購,

如果沒有添加節流,那麽你的頁面,每點擊一次,網絡就會請求一次,更可惡的是,還有一些用鼠

標連點器來搶購,這時,節流就派上用場了。 我可以設置,一秒內,你只能點擊一次, 效果如下:

技術分享圖片

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <
head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8 </head> 9 <body> 10 <div id="num">
0</div> 11 <button id="btn">click</button> 12 13 <script> 14 var oDiv = document.getElementById("num"); 15 var oBtn = document.getElementById("btn"); 16 17 function throttle(handler, wait){// 第一次參數為主要函數,第二個參數為毫秒 18 var lastTime
= 0;//記錄過去的時間 19 return function(){ 20 var nowTime = new Date().getTime(); //獲取時間戳 21 if(nowTime - lastTime > wait){ 22 //用時間戳記錄當前時間,當前時間 減去 上一次的時間,如果大於 wait(你設置的 1000毫秒) 說明 過去1000毫秒了, 23 //用戶可以點擊第二次了。 24 handler.apply(this, arguments)//執行 主要函數, 但是此時的 handler函數的this指向window,也 25 //沒有事件源對象, apply改變this 指向oBtn,傳入 事件源 arguments[0] (e) 26 lastTime = nowTime;//主要函數執行後, 當前時間就成了過去的時間了。 27 } 28 } 29 } 30 oBtn.onclick = throttle(buy, 1000); 31 function buy(){ 32 oDiv.innerText = parseInt(oDiv.innerText) + 1; 33 //每觸發一次,內容 + 1 34 } 35 </script> 36 </body> 37 </html>

防抖:

技術分享圖片

請看上面的gif圖,有沒有發現,用戶在輸入, 還在不停輸入的時候, 事件一直觸發, 但是實際上,

並不需要它一直觸發,我們需要的是,用戶在停止輸入的時候,才觸發事件。 加入防抖,

效果圖如下:

技術分享圖片

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>Document</title>
 8 </head>
 9 <body>
10     <input type="text" id="inp">
11     <script>
12         var oInp = document.getElementById("inp");
13 
14         function debounce (handler, delay){//第一個參數,主要函數,第二個參數為毫秒
15             var timer = null; 
16             return function (){
17                 var _self = this, //獲取this 
18                 _arg = arguments;//獲取事件源對象,(e)
19                 clearTimeout(timer);
20                 timer = setTimeout(function(){
21                     handler.apply(_self, _arg);//執行主要函數,此時的handler函數this指向window,
22                                                 //用apply改變this指向和傳入事件源對象
23                 },delay)
24             }
25         }
26         function ajax (e){//模擬ajax 
27             console.log(this.value);
28             console.log(e); //輸出到控制臺,看看事件源對象 是否為input
29         }
30         oInp.oninput = debounce(ajax, 1000);//綁定事件
31     </script>
32 </body>
33 </html>

javaScript 節流與防抖