介紹 😲
首先看一個沒有經過任何處理的🌰:
1 // 模擬一個輸出的函數 2 function input(value) { 3 console.log(`輸入的內容${value}`) 4 } 5 const ipt = document.getElementById('input') 6 7 ipt.addEventListener("keyup",function(e){ 8 input(e.target.value) 9 })
效果如下:
可以發現,只要按下鍵盤就會觸發函數調用,這樣在某些情況下會造成資源的浪費,在這些情況下,可能只需要在輸入完成后做請求,比如身份驗證等。
防抖處理
首先看下效果:
由此可以看出來,當我們重新頻繁的輸入后,並不會立即調用方法,只有在經過指定的間隔內沒有輸入的情況下才會調用函數方法;
代碼如下:
1 function input(value) { 2 console.log(`輸入的內容${value}`) 3 } 4 const ipt = document.getElementById('input') 5 6 function debounce(fun,delay){ 7 let timer ; 8 return function(args){ 9 const that = this 10 clearTimeout(timer) 11 timer = setTimeout(function(){ 12 fun.call(that,args) 13 },delay) 14 } 15 } 16 const debounceInput = debounce(input,500) 17 ipt.addEventListener("keyup",function(e){ 18 debounceInput(e.target.value) 19 })
節流處理
節流就是在規定的時間間隔呢,重復觸發函數,只有一次是成功調用
先看下效果:
可以看到在一直輸入的情況下每隔一段時間會觸發一次函數
代碼如下:
1 function input(value) { 2 console.log(`輸入的內容${value}`) 3 } 4 const ipt = document.getElementById('input') 5 6 function throttle(fun,delay){ 7 let last,timer; 8 return function(args){ 9 const that = this 10 const now = +new Date() 11 if(last && now < last + delay){ 12 clearTimeout(timer) 13 timer = setTimeout(function(){ 14 fun.call(that,args) 15 },delay) 16 }else{ 17 last = now 18 fun.call(that,args) 19 } 20 } 21 } 22 const throttleInput = throttle(input,1000) 23 ipt.addEventListener("keyup",function(e){ 24 throttleInput(e.target.value) 25 })
方法總結 😴
- 防抖和節流都是為了解決頻繁觸發某個事件的情況造成的性能消耗。
- 防抖就是在出發后的一段時間內執行一次,例如:在進行搜索的時候,當用戶停止輸入后調用方法,節約請求資源
- 節流就是在頻繁觸發某個事件的情況下,每隔一段時間請求一次,類似打游戲的時候長按某個按鍵,動作是有規律的在間隔時間觸發一次