您好,登錄后才能下訂單哦!
小編給大家分享一下JavaScript中去抖與節流的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
無論是面試還是在討論瀏覽器優化過程中,都會涉及到去抖動和節流的問題。
總的來說,這二者是一種限制事件觸發頻率的方式。不同的是,節流會指定事件觸發的時間間隔;而去抖動會指定事件不觸發的時間間隔。從結果上來看,節流降低了時間處理的敏感度;而去抖對從觸發事件先存儲起來,等到超過指定事件間隔后,一起發送。
越來越暈,直接上代碼:
HTML
<input type="text" oninput="fatch()">
這里有一個供用戶搜索使用的input標簽,有一個input事件會觸發的處理函數fatch,這個fatch會根據input的value值向后臺去請求聯想詞。
上面代碼思路是沒有問題的,但是如果不做觸發限制的話,可能會產生大量的http請求,而這些請求里面很多可能意義不大,為我們的優化提供了空間;下面,我就采用節流和去抖兩種思路來解決這個問題。(一般針對input這種情況,使用去抖解決;這里只是方便做代碼說明)
function jieliu (func, time){//func 執行函數, time 時間間隔 let lastRun = null return function(){ const now = new Date() if(now - lastRun > time){ func(...arguments) lastRun = now } } } const listener = jieliu(function(value){//監聽函數,指定間隔時間 console.log(value) }, 1000) const input = document.querySelector("input") //調用方法 input.addEventListener("input", function(event){ listener(event.target.value) })
以上是比較簡單的節流實現以及基本的調用方式;使用閉包是為了保存每一次執行的lastRun。基本實現了限制請求頻率的需求,但忽略了最后一個的觸發。
改進如下:
function jieliu (func, time){// 觸發時間間隔>time 發送請求 let lastRun = null let timeout = undefined return function(){ const self = this; const now = new Date() if(now - lastRun > time){ if(timeout){ clearTimeout(timeout) timeout = undefined } func.apply(self, arguments) lastRun = now } else{ if(!timeout){ timeout = setTimeout(func.apply(self, arguments), time) } } } }
加入timeout,判斷是否是最后一次請求。
function qudou(func, time){ let timeout = undefined return function(){ const argu = arguments const self = this if(timeout){ clearTimeout(timeout) timeout = undefined }else{ timeout = setTimeout(func.apply(this, arguments), time) } } }
以上簡單實現去抖動,同樣,最后一次事件不能夠觸發處理函數。
改進如下:
function qudou(func, time){//判斷連續time時間內不觸發,發送func請求 let timeout = undefined; let lastRun = null return function(){ const self = this const now = new Date() if(now - lastRun > time){ func.apply(self, arguments) } else { if(!timeout){ timeout = setTimeout(func.apply(self, arguments), time) } else { clearTimeout(timeout) timeout = undefined } } lastRun = new Date() } }
通篇寫下來,節流主要的實現方式還是通過對比“now”與“lastRun”的時間差,進而減少處理函數的調用次數;而防抖還是通過settimeout來延緩處理函數的調用時機,進而把多次觸發的結果匯總一起調用處理函數。
以上是“JavaScript中去抖與節流的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。