網(wǎng)頁(yè)中JavaScript最基本的功能是監(jiān)聽(tīng)或響應(yīng)用戶的動(dòng)作,這非常的有用。用戶的動(dòng)作有些頻率非常高,有的十分罕見(jiàn)。有些監(jiān)聽(tīng)器函數(shù)的執(zhí)行如閃電般完成,而有些繁重的會(huì)把瀏覽器拖死。拿瀏覽器窗口的resize事件來(lái)說(shuō),這種事件會(huì)在瀏覽器窗口大小的每一尺度變化都觸發(fā)一次,如果監(jiān)聽(tīng)器體量很大,你的瀏覽器很快就會(huì)被拖垮。
很顯然,我們不能允許瀏覽器被拖垮,但我們又不能刪除刪除監(jiān)聽(tīng)器。然而,我們可以限制函數(shù)調(diào)用的頻度,弱化事件函數(shù)運(yùn)行帶來(lái)的影響。相對(duì)于讓窗口的每一步size的變化都觸發(fā)一次監(jiān)聽(tīng)器函數(shù),我們可以現(xiàn)在監(jiān)聽(tīng)函數(shù)的觸發(fā)的最小間隔必須大于多少毫秒,讓它保持著合理的調(diào)用頻道,確保不毀壞用戶體驗(yàn)。有一個(gè)很好的js工具庫(kù)叫做Underscore.js,它里面有一個(gè)簡(jiǎn)單的方法能讓你輕松的創(chuàng)建降低事件函數(shù)觸發(fā)頻度的監(jiān)聽(tīng)器。
JavaScript代碼
降頻監(jiān)聽(tīng)器的代碼很簡(jiǎn)單:
// 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);
};
};
// Use it!
window.addEvent("resize", myFn.debounce(500));
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注