在JavaScript里防止事件函數(shù)高頻觸發(fā)和高頻調(diào)用的方法
網(wǎng)頁中JavaScript最基本的功能是監(jiān)聽或響應(yīng)用戶的動(dòng)作,這非常的有用。用戶的動(dòng)作有些頻率非常高,有的十分罕見。有些監(jiān)聽器函數(shù)的執(zhí)行如閃電般完成,而有些繁重的會(huì)把瀏覽器拖死。拿瀏覽器窗口的resize事件來說,這種事件會(huì)在瀏覽器窗口大小的每一尺度變化都觸發(fā)一次,如果監(jiān)聽器體量很大,你的瀏覽器很快就會(huì)被拖垮。
很顯然,我們不能允許瀏覽器被拖垮,但我們又不能刪除刪除監(jiān)聽器。然而,我們可以限制函數(shù)調(diào)用的頻度,弱化事件函數(shù)運(yùn)行帶來的影響。相對(duì)于讓窗口的每一步size的變化都觸發(fā)一次監(jiān)聽器函數(shù),我們可以現(xiàn)在監(jiān)聽函數(shù)的觸發(fā)的最小間隔必須大于多少毫秒,讓它保持著合理的調(diào)用頻道,確保不毀壞用戶體驗(yàn)。有一個(gè)很好的js工具庫叫做Underscore.js,它里面有一個(gè)簡(jiǎn)單的方法能讓你輕松的創(chuàng)建降低事件函數(shù)觸發(fā)頻度的監(jiān)聽器。
JavaScript代碼
降頻監(jiān)聽器的代碼很簡(jiǎn)單:
// 創(chuàng)建監(jiān)聽器
var updateLayout = _.debounce(function(e) {
// Does all the layout updating here
}, 500); // 最低500毫秒運(yùn)行一次
// Add the event listener
window.addEventListener("resize", updateLayout, false);
…這段Underscore.js代碼底層實(shí)際上是用interval檢查事件函數(shù)調(diào)用的頻度:
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
_.debounce = function(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
代碼并不是特別復(fù)雜,但用不著自己寫也是一種幸福。這個(gè)debounce函數(shù)并沒有依賴其他的Underscore.js函數(shù),所以,你可以把這個(gè)方法添加到你喜歡的js工具庫中,例如jQuery或MooTools,很容易:
// MooTools
Function.implement({
debounce: function(wait, immediate) {
var timeout,
func = this;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
});
// Use it!
window.addEvent("resize", myFn.debounce(500));
正如上面說的,窗口的resize事件是最常見的使用降頻操作的地方,還有一個(gè)常用的地方是,根據(jù)用戶的按鍵輸入給出自動(dòng)補(bǔ)全提示。我非常喜歡收集這樣的代碼片段,它們能輕松的讓你的網(wǎng)站更高效。同時(shí)也推薦大家研究一下Underscore.js,里面提供了大量非常有用的函數(shù)。
相關(guān)文章
javascript設(shè)計(jì)模式 – 適配器模式原理與應(yīng)用實(shí)例分析
這篇文章主要介紹了javascript設(shè)計(jì)模式 – 適配器模式,結(jié)合實(shí)例形式分析了javascript適配器模式相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04JS中for,for...in,for...of和forEach的區(qū)別和用法實(shí)例
JS遍歷數(shù)組(循環(huán)數(shù)組)的方式有多種,可以使用傳統(tǒng)的for循環(huán),也可以使用升級(jí)版的for in循環(huán),還可以使用Array類型的forEach() 方法,這篇文章主要給大家介紹了關(guān)于JS中for、for...in、for...of和forEach的區(qū)別和用法的相關(guān)資料,需要的朋友可以參考下2021-11-11微信小程序如何獲知用戶運(yùn)行小程序的場(chǎng)景教程
這篇文章主要給大家介紹了在微信小程序中如何獲知用戶運(yùn)行小程序場(chǎng)景的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起來看看吧。2017-05-05js鼠標(biāo)點(diǎn)擊圖片切換效果實(shí)現(xiàn)代碼
這篇文章為大家分享了js鼠標(biāo)點(diǎn)擊圖片切換效果實(shí)現(xiàn)代碼,特別炫酷的效果,具有一定的參考價(jià)值,推薦給大家,感興趣的小伙伴們可以參考一下2015-11-11uniapp頁面回到頂部?jī)煞N實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于uniapp頁面回到頂部?jī)煞N實(shí)現(xiàn)方法的相關(guān)資料,在uniapp中要實(shí)現(xiàn)回到頂部的效果有兩種方法實(shí)現(xiàn),文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-08-08