摘要:此時需要采用防抖和節流的方式來減少調用頻率,同時不影響原來效果。函數防抖當持續觸發事件時,一段時間段內沒有再觸發事件,事件處理函數才會執行一次,如果設定的時間到來之前就觸發了事件,延時重新開始。
js 防抖 節流 JavaScript
實際工作中,通過監聽某些事件,如scroll事件檢測滾動位置,根據滾動位置顯示返回頂部按鈕;如resize事件,對某些自適應頁面調整DOM的渲染;如keyup事件,監聽文字輸入并調用接口進行模糊匹配等等,這些事件處理函數調用的頻率如果太高,會加重瀏覽器的負擔,減弱性能,造成用戶體驗不好。此時需要采用debounce(防抖)和throttle(節流)的方式來減少調用頻率,同時不影響原來效果。
函數防抖(debounce)當持續觸發事件時,一段時間段內沒有再觸發事件,事件處理函數才會執行一次,如果設定的時間到來之前就觸發了事件,延時重新開始。
函數防抖的應用場景,最常見的就是用戶注冊時候的手機號碼驗證和郵箱驗證了。只有等用戶輸入完畢后,前端才需要檢查格式是否正確,如果不正確,再彈出提示語。
上圖中,持續觸發scroll事件時,并不執行handle函數,當1000毫秒內沒有觸發scroll事件時,才會延時觸發scroll事件;
上面原理:對處理函數進行延時操作,若設定的延時到來之前,再次觸發事件,則清除上一次的延時操作定時器,重新定時。
代碼如下:
// 函數防抖 var timer = false; document.getElementById("debounce").onscroll = function(){ clearTimeout(timer); // 清除未執行的代碼,重置回初始化狀態 timer = setTimeout(function(){ console.log("函數防抖"); }, 1000); };
防抖函數的封裝使用
/** * 防抖函數 * @param method 事件觸發的操作 * @param delay 多少毫秒內連續觸發事件,不會執行 * @returns {Function} */ function debounce(method,delay) { let timer = null; return function () { let self = this, args = arguments; timer && clearTimeout(timer); timer = setTimeout(function () { method.apply(self,args); },delay); } } window.onscroll = debounce(function () { let scrollTop = document.body.scrollTop || document.documentElement.scrollTop; console.log("滾動條位置:" + scrollTop); },1000)
另一種寫法
// 防抖 function debounce(fn, wait) { var timeout = null; return function() { if(timeout !== null) clearTimeout(timeout); timeout = setTimeout(fn, wait); } } // 處理函數 function handle() { console.log("函數防抖"); } // 滾動事件 window.addEventListener("scroll", debounce(handle, 1000));函數節流(throttlo)
當持續觸發事件時,保證一定時間段內只調用一次事件處理函數。
函數節流應用的實際場景,多數在監聽頁面元素滾動事件的時候會用到。
上圖中,持續觸發scroll事件時,并不立即執行handle函數,每隔1000毫秒才會執行一次handle函數;
函數節流的要點是,聲明一個變量當標志位,記錄當前代碼是否在執行。如果空閑,則可以正常觸發方法執行。
代碼如下:
// 函數節流 定時器 var canRun = true; document.getElementById("throttle").onscroll = function(){ if(!canRun){ // 判斷是否已空閑,如果在執行中,則直接return return; } canRun = false; setTimeout(function(){ console.log("函數節流"); canRun = true; }, 300); };
節流函數的封裝使用
//節流throttle代碼(時間戳) var throttle = 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(); } } } function handle() { console.log("函數節流"); } window.addEventListener("scroll", throttle(handle, 1000));
//節流throttle代碼(定時器) var throttle = function(func, delay) { var timer = null; return function() { var context = this; var args = arguments; if (!timer) { timer = setTimeout(function() { func.apply(context, args); timer = null; }, delay); } } } function handle() { console.log("函數節流"); } window.addEventListener("scroll", throttle(handle, 1000));
// 節流throttle代碼(時間戳+定時器): var throttle = function(func, delay) { var timer = null; var startTime = Date.now(); return function() { var curTime = Date.now(); var remaining = delay - (curTime - startTime); var context = this; var args = arguments; clearTimeout(timer); if (remaining <= 0) { func.apply(context, args); startTime = Date.now(); } else { timer = setTimeout(func, remaining); } } } function handle() { console.log("函數節流"); } window.addEventListener("scroll", throttle(handle, 1000));
用時間戳+定時器,當第一次觸發事件時馬上執行事件處理函數,最后一次觸發事件后也還會執行一次事件處理函數
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/101157.html
摘要:概念函數防抖和函數節流,兩者都是優化高頻率執行代碼的一種手段。防抖任務頻繁觸發的情況下,只有任務觸發的間隔超過指定間隔的時候,任務才會執行。節流指定時間間隔內只會執行一次任務一定時間內方法只跑一次。 概念 函數防抖和函數節流,兩者都是優化高頻率執行js代碼的一種手段。 防抖:任務頻繁觸發的情況下,只有任務觸發的間隔超過指定間隔的時候,任務才會執行。 節流:指定時間間隔內只會執行一次任...
摘要:若時間差大于間隔時間,則立刻執行一次函數。不同點函數防抖,在一段連續操作結束后,處理回調,利用和實現。函數防抖關注一定時間連續觸發的事件只在最后執行一次,而函數節流側重于一段時間內只執行一次。 原博客地址,歡迎star 函數防抖和節流 函數防抖和函數節流:優化高頻率執行js代碼的一種手段,js中的一些事件如瀏覽器的resize、scroll,鼠標的mousemove、mouseover...
摘要:封裝方法也比較簡單,書中對此問題也進行了處理使用定時器,讓函數延遲秒后執行,在此秒內,然后函數再次被調用,則刪除上次的定時器,取消上次調用的隊列任務,重新設置定時器。 在實際開發中,函數一定是最實用最頻繁的一部分,無論是以函數為核心的函數式編程,還是更多人選擇的面向對象式的編程,都會有函數的身影,所以對函數進行深入的研究是非常有必要的。 函數節流 比較直白的說,函數節流就是強制規定一...
摘要:今天和別人聊到函數的節流和防抖,發現自己對這兩個的區別很是模糊,遂小小實踐一下,在此記錄,希望對需要的人有所幫助。防抖實現順利,但是兩個節流方法的執行結果存在差異。 今天和別人聊到JavaScript函數的節流和防抖,發現自己對這兩個的區別很是模糊,遂小小實踐一下,在此記錄,希望對需要的人有所幫助。 節流 - 頻繁操作,間隔一定時間去做一件事 舉例說明:假定時間間隔為 500ms,頻繁...
摘要:隆重請出主角防抖與節流。防抖與節流的異同相同都是防止某一時間段內,函數被頻繁調用執行,通過時間頻率控制,減少回調函數執行次數,來實現相關性能優化。參考文章分鐘理解的節流防抖及使用場景函數防抖和節流 showImg(https://segmentfault.com/img/bVburM8?w=800&h=600); 本篇課題,或許早已是爛大街的解讀文章。不過春招系列面試下來,不少伙伴們還...
閱讀 2764·2021-11-22 14:45
閱讀 915·2021-10-15 09:41
閱讀 1074·2021-09-27 13:35
閱讀 3698·2021-09-09 11:56
閱讀 2641·2019-08-30 13:03
閱讀 3203·2019-08-29 16:32
閱讀 3312·2019-08-26 13:49
閱讀 779·2019-08-26 10:35