隨筆-5  評論-1  文章-0  trackbacks-0

          古木天琪 標簽:

           

          函數節流技術的主要思路是,通過一個定時器,阻斷連續重復的函數調用。對于我們自己內部使用的函數,這通常意義不大,也不推薦使用這個技術,它可能會丟失對某些數據的處理。但是對于在用戶界面調用的函數,卻非常有意義。例如一個 mousemove 或者 IE 中 resize 事件的監聽函數。

          JavaScript 函數節流

          這類事件監聽函數往往伴隨著兩個主要特征:1. 短時間內連續多次重復觸發 ; 2. 大量的 DOM 操作。眾所周知,DOM 操作對內存和 CPU 的開銷是比較大的,特別是當同時滿足特征1時,往往給瀏覽器造成不小的壓力。函數節流技術的意義在于在用戶察覺范圍外,降低函數調用的頻率,從而提升性能。

          這個技巧的大概模式如下面這樣:

           1 var processor = {
           2     timeoutId: null,
           3                    
           4     performProcessing: function(){
           5             // 要執行的代碼
           6     },
           7 
           8     process: function(){
           9         clearTimeout(this.timeoutId);
          10         this.timeoutId  = setTimeout(function(){
          11             processor.performProcessing();
          12         }, 100);
          13     }
          14 };
          15                    
          16 //調用
          17 processor.process();
          performProcessing 是真正要調用的函數,而程序的入口在 process,每次進入 process,真正要調用的函數 performProcessing 都會被延遲 100 毫秒執行,如果在此期間,process 再次被調用,則會重置前一次的計時器,重新開始計時,這樣保證了 performProcessing 中的代碼至少要間隔 100 毫秒才會被執行一次,原理非常的簡單,下面這個函數也是利用這個原理,通過閉包達到了同樣的目的,它接受兩個參數,第一個是要真正要執行的函數,第二個是間隔的時間。
          function throttle(fn, delay) {
              var timer = null;
              return function () {
                  var context = this, args = arguments;
                  clearTimeout(timer);
                  timer = setTimeout(function () {
                  fn.apply(context, args);
              }, delay);
            };
          }

          另外,有人為 jQuery 寫了相同功能的插件:點擊這里傳送到 jQuery plugins

          Google Closure Library 也有類似的 API:點擊這里傳送到 Google Code

          posted on 2011-09-28 15:50 古木天琪 閱讀(261) 評論(0)  編輯  收藏 所屬分類: jQuery技術HTML5技術前端開發
          主站蜘蛛池模板: 渝北区| 平乡县| 六安市| 阳山县| 肇庆市| 邢台县| 宁化县| 从江县| 密山市| 贞丰县| 蒲城县| 贡嘎县| 镇雄县| 姚安县| 略阳县| 四会市| 都昌县| 九台市| 武陟县| 调兵山市| 清苑县| 筠连县| 象山县| 精河县| 蒙自县| 东兰县| 土默特右旗| 石柱| 东乡族自治县| 星子县| 神池县| 屯门区| 新沂市| 百色市| 永康市| 永春县| 长治市| 仁寿县| 新平| 邵武市| 通渭县|