js防抖函數和節(jié)流函數使用場景和實現區(qū)別示例分析
本文實例講述了js防抖函數和節(jié)流函數使用場景和實現區(qū)別。分享給大家供大家參考,具體如下:
開發(fā)過程中,都遇到過某個事件被頻發(fā)觸發(fā)的場景,比如resize,scroll事件,input事件,而對應的事件處理函數也會被高頻率調用,這時會增加瀏覽器負擔,用戶體驗也不好,這也是防抖函數和節(jié)流函數存在的意義和使用場景。
函數防抖(debounce):
持續(xù)觸發(fā)事件時,在設定時間段內沒有被觸發(fā),才去調用事件處理函數,在設定時間段內如果事件又被觸發(fā),則不調用事件處理函數,并從觸發(fā)事件時間重新開始延時。
具體實現:
設計思路:在setTimeout中調用事件處理函數,如果在定時器觸發(fā)函數執(zhí)行之前又觸發(fā)函數,清除定時器。
function debounce(fn, timeout){ timeout = timeout || 1000; let timer; return () => { if(timer){ clearTimeout(timer)} timer = setTimeout(() => { fn() },timeout) }} function printEvent(){ console.log(’1121212’)} window.addEventListener(’scroll’,debounce(printEvent,1000),false)
節(jié)流函數(throttle) throttle [’θrɑt(ə)l] 油門;節(jié)氣門;扼殺
當事件被持續(xù)觸發(fā)時,在設定時間內只讓事件處理函數觸發(fā)一次。
定時器實現模式:定時器在延時時間執(zhí)行過后,重置為null, 定時器為null時,重新設置定時器,如此循環(huán)
//節(jié)流函數function throttle(fn, range){ range = range || 1000; let timer; return () => { //console.log(111,typeof timer) if(!timer){ timer = setTimeout( () => {fn()timer = null },range) } }} window.addEventListener(’mousemove’,throttle(printEvent,1000),false)
時間戳實現模式:初始化時獲取時間,每次觸發(fā)事件時再次獲取時間,兩次時間間隔等于或大于設定時間,執(zhí)行事件,初始化時間重置為當前時間,如此循環(huán)。
//節(jié)流函數 時間戳模式var throttle2 = function(func, delay) {var prev = Date.now();return function() {var context = this;var args = arguments;var now = Date.now();if (now - prev >= delay) {func.apply(context, args);prev = Date.now();}}}
也可以使用時間戳加定時器結合實現:
總結:
函數防抖:在無事件觸發(fā)后的設定時間執(zhí)行事件,將幾次操作合并為一此操作進行。這樣一來,只有最后一次操作能被觸發(fā)。
函數節(jié)流:使得一定時間內只觸發(fā)一次函數。原理是通過判斷是否到達一定時間來觸發(fā)函數。
區(qū)別: 函數節(jié)流不管事件觸發(fā)有多頻繁,都會保證在規(guī)定時間內一定會執(zhí)行一次真正的事件處理函數,而函數防抖只是在最后一次事件后才觸發(fā)一次函數。
比如在頁面的無限加載場景下,我們需要用戶在滾動頁面時,每隔一段時間發(fā)一次 Ajax 請求,而不是在用戶停下滾動頁面操作時才去請求數據。這樣的場景,就適合用節(jié)流技術來實現。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關于JavaScript相關內容可查看本站專題:《JavaScript常用函數技巧匯總》、《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
相關文章:
1. pip已經安裝好第三方庫但pycharm中import時還是標紅的解決方案2. 關于Mysql-connector-java驅動版本問題總結3. CSS自定義滾動條樣式案例詳解4. 詳解CSS偽元素的妙用單標簽之美5. 將properties文件的配置設置為整個Web應用的全局變量實現方法6. Ajax實現表格中信息不刷新頁面進行更新數據7. HTML <!DOCTYPE> 標簽8. SpringBoot+Shiro+LayUI權限管理系統(tǒng)項目源碼9. ajax post下載flask文件流以及中文文件名問題10. msxml3.dll 錯誤 800c0019 系統(tǒng)錯誤:-2146697191解決方法
