摘要:定義定時器清空定時器重置定時器防抖流程觸發(fā)觸發(fā)定義一個定時器,返回執(zhí)行內(nèi)容為清除當(dāng)前定時器,定義執(zhí)行內(nèi)容。
防抖
為了避免一些監(jiān)聽事件為在自己預(yù)料的情況,頻繁觸發(fā)。or 在某些監(jiān)聽命令會頻繁觸發(fā)事件比如resize、mousemove等等未防抖 示例
var count = 0, Elem = doc.getElementById("con") function appendCount(e) { console.log(e); Elem.innerHTML = count++ } // 正常,沒有防抖的情況下,直接監(jiān)聽執(zhí)行 Elem.addEventListener("mousemove", function() { appendCount() })
這會導(dǎo)致,只要鼠標(biāo)移動,會導(dǎo)致Eelm.innerHTML不斷改變。現(xiàn)在看起來好像沒什么問題,如果是很多數(shù)據(jù)渲染或者請求幾千條列表數(shù)據(jù)呢?
會導(dǎo)致瀏覽器不斷回流和重繪。
那如何防抖呢??觸發(fā)mousemove時間后1s內(nèi),只有不在觸發(fā)mousemove方法才會能執(zhí)行appendCount()。
var count = 0, Elem = doc.getElementById("con"); function debounce(fn, waitTime){ // 定義定時器 var timeoutFn = null; return function (){ // 清空定時器 clearTimeout(timeoutFn); // 重置定時器 timeoutFn = (() => { fn.apply(this, arguments) },waitTime) } } function appendCount(){ ELem.innerHTML=count++; } Elem.addEventListener("mousemove", debounce(appendCount, 500))防抖流程
mousemove觸發(fā),觸發(fā)debounce()`
定義一個定時器timeoutFn,返回執(zhí)行內(nèi)容為:清除當(dāng)前timeoutFn定時器( timeoutFn = null;),定義執(zhí)行內(nèi)容。
// debounce() 返回內(nèi)容 function (){ // 清空定時器 clearTimeout(timeoutFn); // 重置定時器 timeoutFn = (() => { fn.apply(this, arguments) },waitTime) }
當(dāng)mousemove再觸發(fā),timeoutFn定時器再次清空,重新定義執(zhí)行內(nèi)容
只有等到最后一次mousemove,定時器沒有被debounce()清除timeoutFn定時器,最后執(zhí)行 fn.apply(this, agruments);
節(jié)流相對比防抖,我是這樣理解節(jié)流的:當(dāng)我們想觸發(fā)在一段時間范圍有且只觸發(fā)一次這樣的事件,這樣我們可以更節(jié)約我們的資源和網(wǎng)絡(luò)請求。
就當(dāng)上面的AppendCount()舉例,我只想在3s內(nèi)之能觸發(fā)一次事件AppendCount()。
那么應(yīng)該怎么處理呢?
var count = 0, Elem = doc.getElementById("con"); function throttle(fn,waitTime){ var timeoutFn = null; return function () { // 如果存在timeoutFn定時器,則等待timeoutFn執(zhí)行完成 if(!timeoutFn){ timeoutFn = (() => { // 置空定時器 clearTimeout(timeoutFn) fn.apply(this, arguments) },waitTime) } } } function appendCount(){ ELem.innerHTML=count++; } Elem.addEventListener("mousemove", throttle(appendCount, 3000))
這和防抖不同的是,是等待timeoutFn執(zhí)行完成后,通過clearTimeout(timeoutFn)置空,那么在3s后才能再次執(zhí)行timeoutFn
還有一個寫法,和上面有一點(diǎn)不同,上面的是當(dāng)在第1s觸發(fā)throttle,但是要在第4s才能執(zhí)行appendCount。但是下面是立即執(zhí)行,當(dāng)?shù)?s觸發(fā)throttle,就執(zhí)行appendCount,然后在第4s后可以再次會發(fā)throttle
var count = 0, Elem = doc.getElementById("con"); function throttle(fn, waitTime){ // 定義定時器、執(zhí)行狀態(tài) var timeoutFn = null, isRuning = false; return function () { // 如果不在執(zhí)行狀態(tài) if(!isRuning){ // 開啟執(zhí)行狀態(tài) isRuning = true; // 定義定時器 timeoutFn =(() => { fn.apply(this, arguments); // 執(zhí)行完成,關(guān)閉執(zhí)行狀態(tài) isRuning = false; },waitTime) } } } function appendCount(){ ELem.innerHTML=count++; } Elem.addEventListener("mousemove", throttle(appendCount, 3000))參考
JavaScript專題之跟著underscore學(xué)節(jié)流
JavaScript專題之跟著underscore學(xué)防抖
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/54254.html
摘要:定義定時器清空定時器重置定時器防抖流程觸發(fā)觸發(fā)定義一個定時器,返回執(zhí)行內(nèi)容為清除當(dāng)前定時器,定義執(zhí)行內(nèi)容。 防抖 為了避免一些監(jiān)聽事件為在自己預(yù)料的情況,頻繁觸發(fā)。or 在某些監(jiān)聽命令會頻繁觸發(fā)事件比如resize、mousemove等等 未防抖 示例 var count = 0, Elem = doc.getElementById(con) ...
摘要:若時間差大于間隔時間,則立刻執(zhí)行一次函數(shù)。不同點(diǎn)函數(shù)防抖,在一段連續(xù)操作結(jié)束后,處理回調(diào),利用和實(shí)現(xiàn)。函數(shù)防抖關(guān)注一定時間連續(xù)觸發(fā)的事件只在最后執(zhí)行一次,而函數(shù)節(jié)流側(cè)重于一段時間內(nèi)只執(zhí)行一次。 原博客地址,歡迎star 函數(shù)防抖和節(jié)流 函數(shù)防抖和函數(shù)節(jié)流:優(yōu)化高頻率執(zhí)行js代碼的一種手段,js中的一些事件如瀏覽器的resize、scroll,鼠標(biāo)的mousemove、mouseover...
摘要:運(yùn)用防抖和節(jié)流可以有效降低代碼的執(zhí)行頻率,從而解決高頻率事件的頁面卡頓問題。在階段布局,最終確定顯示的位置和大小。在函數(shù)中,首先定義了一個空的定時器變量,用來計算時間間隔。還有一點(diǎn)要注意,在中一定要清楚定時器,不然會影響的條件判斷。 啥是節(jié)流? 節(jié)流是保證在一段時間內(nèi),代碼只執(zhí)行了一次。這個一段時間內(nèi)指的是不管用戶操作了幾次,最終僅執(zhí)行一次。比如說一個按鈕,用戶狂點(diǎn)按鈕,但是如果用節(jié)流...
摘要:運(yùn)用防抖和節(jié)流可以有效降低代碼的執(zhí)行頻率,從而解決高頻率事件的頁面卡頓問題。在階段布局,最終確定顯示的位置和大小。在函數(shù)中,首先定義了一個空的定時器變量,用來計算時間間隔。還有一點(diǎn)要注意,在中一定要清楚定時器,不然會影響的條件判斷。 啥是節(jié)流? 節(jié)流是保證在一段時間內(nèi),代碼只執(zhí)行了一次。這個一段時間內(nèi)指的是不管用戶操作了幾次,最終僅執(zhí)行一次。比如說一個按鈕,用戶狂點(diǎn)按鈕,但是如果用節(jié)流...
閱讀 1660·2021-11-16 11:41
閱讀 2457·2021-11-08 13:14
閱讀 3106·2019-08-29 17:16
閱讀 3079·2019-08-29 16:30
閱讀 1843·2019-08-29 13:51
閱讀 356·2019-08-23 18:38
閱讀 3223·2019-08-23 17:14
閱讀 630·2019-08-23 15:09