摘要:為了解決這個(gè)問題,我們只能通過減少執(zhí)行函數(shù)的次數(shù)來提高響應(yīng)速度。時(shí)間間隔內(nèi)若再次觸發(fā)事件,則重新計(jì)時(shí),直到停止時(shí)間大于或等于才執(zhí)行函數(shù)。
某些場景下,比如響應(yīng)鼠標(biāo)移動(dòng)或者窗口大小調(diào)整的事件,觸發(fā)頻率比較高。若處理函數(shù)稍微復(fù)雜,需要較多的運(yùn)算執(zhí)行時(shí)間,響應(yīng)速度跟不上觸發(fā)頻率,往往會出現(xiàn)延遲,導(dǎo)致假死或者卡頓感。
為了解決這個(gè)問題,我們只能通過減少執(zhí)行函數(shù)的次數(shù)來提高響應(yīng)速度。
throttle 和 debounce 是解決請求和響應(yīng)速度不匹配問題的兩個(gè)方案。二者的差異在于選擇不同的策略。
throttle 等時(shí)間間隔執(zhí)行函數(shù)。
debounce 時(shí)間間隔 t 內(nèi)若再次觸發(fā)事件,則重新計(jì)時(shí),直到停止時(shí)間大于或等于 t 才執(zhí)行函數(shù)。
throttle/** * * @param fn {Function} 實(shí)際要執(zhí)行的函數(shù) * @param delay {Number} 執(zhí)行間隔,單位是毫秒(ms) * * @return {Function} 返回一個(gè)“節(jié)流”函數(shù) */ function throttle(fn, threshhold) { // 記錄上次執(zhí)行的時(shí)間 var last // 定時(shí)器 var timer // 默認(rèn)間隔為 250ms threshhold || (threshhold = 250) // 返回的函數(shù),每過 threshhold 毫秒就執(zhí)行一次 fn 函數(shù) return function () { // 保存函數(shù)調(diào)用時(shí)的上下文和參數(shù),傳遞給 fn var context = this var args = arguments var now = +new Date() // 如果距離上次執(zhí)行 fn 函數(shù)的時(shí)間小于 threshhold,那么就放棄 // 執(zhí)行 fn,并重新計(jì)時(shí) if (last && now < last + threshhold) { clearTimeout(timer) // 保證在當(dāng)前時(shí)間區(qū)間結(jié)束后,再執(zhí)行一次 fn timer = setTimeout(function () { last = now fn.apply(context, args) }, threshhold) // 在時(shí)間區(qū)間的最開始和到達(dá)指定間隔的時(shí)候執(zhí)行一次 fn } else { last = now fn.apply(context, args) } } }
調(diào)用方法
$("body").on("mousemove", throttle(function (event) { console.log("tick"); }, 1000));debounce
function debounce(fn, delay) { var timer = null; return function () { var context = this, args = arguments; clearTimeout(timer); timer = setTimeout(function () { fn.apply(context, args); }, delay); }; }
調(diào)用方法
$("input.username").keypress(debounce(function (event) { // do the Ajax request }, 250));
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85644.html
摘要:本篇文章主要是跟大家聊聊的內(nèi)部架構(gòu)體系,讓大家對有個(gè)整體的認(rèn)知。方法會創(chuàng)建一個(gè)對象,調(diào)用它的方法將字節(jié)流封裝成對象,在創(chuàng)建組件時(shí),會將組件添加到組件中組件而組件在連接器初始化時(shí)就已經(jīng)創(chuàng)建好了目前為止,只有一個(gè)實(shí)現(xiàn)類,就是。 微信公眾號「后端進(jìn)階」,專注后端技術(shù)分享:Java、Golang、WEB框架、分布式中間件、服務(wù)治理等等。 老司機(jī)傾囊相授,帶你一路進(jìn)階,來不及解釋了快上車! T...
摘要:能達(dá)到一個(gè)積木塊模塊的要求。接下來我們將改進(jìn)它。結(jié)尾到此,我們自己構(gòu)建了一個(gè)很實(shí)用的模塊化工具,項(xiàng)目的源碼在這里,喜歡的話,給個(gè)。 前言 希望編寫程序能像玩積木一樣,首先規(guī)劃要產(chǎn)出怎樣的作品,然后在積木堆中挑選合適的積木塊,最后一組合就完工了。 于是JavaScript需要類似這樣模塊化,每個(gè)模塊都隱藏內(nèi)部細(xì)節(jié)并且對外暴露接口,再處理好模塊之間的依賴關(guān)系,就可以達(dá)到玩積木的效果了。 雖...
摘要:參考資料事件代理很久很久以來,總感覺事件發(fā)生與事件代理到之間沒什么鳥區(qū)別。要搞清楚什么是事件代理,就需要先搞清楚什么是代理。,怎么從字面來理解事件代理一詞的含義后文有講。于是,看了事件代理的資料。這一過程被稱為事件冒泡。 參考資料:js-事件代理 很久很久以來,總感覺事件發(fā)生與事件代理到之間沒什么鳥區(qū)別。 最近,又看了一下,感覺區(qū)別其實(shí)真不大!看怎么理解吧。 要搞清楚什么是事件代理,就...
摘要:寫著寫著發(fā)現(xiàn)會寫不少內(nèi)容全部寫在一篇文章里感覺太多了不方便看,所以分為上下篇吧下篇寫完啦,感興趣的朋友可以繼續(xù)關(guān)注開發(fā)仿旅游站項(xiàng)目總結(jié)下溫馨提示此文章,僅是做完項(xiàng)目后的個(gè)人覺得可以總結(jié)下來的操作思路,接觸不久的朋友應(yīng)該會有收獲。 寫著寫著發(fā)現(xiàn)會寫不少內(nèi)容... 全部寫在一篇文章里感覺太多了不方便看,所以分為上下篇吧...下篇寫完啦,感興趣的朋友可以繼續(xù)關(guān)注 => Vue開發(fā)仿旅游站we...
閱讀 1845·2021-11-23 09:51
閱讀 1303·2021-11-18 10:02
閱讀 974·2021-10-25 09:44
閱讀 2114·2019-08-26 18:36
閱讀 1634·2019-08-26 12:17
閱讀 1158·2019-08-26 11:59
閱讀 2755·2019-08-23 15:56
閱讀 3367·2019-08-23 15:05