国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

在JavaScript里防止事件函數(shù)高頻觸發(fā)和高頻調(diào)用的方法

2019-11-20 14:10:11
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

網(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)單:

復(fù)制代碼 代碼如下:

// 創(chuàng)建監(jiān)聽(tīng)器
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ù)雜,但用不著自己寫(xiě)也是一種幸福。這個(gè)debounce函數(shù)并沒(méi)有依賴其他的Underscore.js函數(shù),所以,你可以把這個(gè)方法添加到你喜歡的js工具庫(kù)中,例如jQuery或MooTools,很容易:
復(fù)制代碼 代碼如下:

// 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));


正如上面說(shuō)的,窗口的resize事件是最常見(jiàn)的使用降頻操作的地方,還有一個(gè)常用的地方是,根據(jù)用戶的按鍵輸入給出自動(dòng)補(bǔ)全提示。我非常喜歡收集這樣的代碼片段,它們能輕松的讓你的網(wǎng)站更高效。同時(shí)也推薦大家研究一下Underscore.js,里面提供了大量非常有用的函數(shù)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴和县| 肇州县| 枣庄市| 清镇市| 普安县| 柘荣县| 元谋县| 独山县| 台湾省| 礼泉县| 和田县| 莆田市| 资阳市| 新田县| 万安县| 右玉县| 冀州市| 峨边| 深泽县| 河北省| 鄂温| 建阳市| 石渠县| 大庆市| 雷山县| 长阳| 手机| 南昌市| 商水县| 湾仔区| 桦川县| 万载县| 太仓市| 灵宝市| 嘉兴市| 神池县| 惠安县| 措勤县| 榆社县| 五寨县| 交城县|