1 /* 2 * 函數功能:函數節流 3 * fn 須要調用的函數 4 * delay 函數須要延遲處理的時間 5 * mustRunDelay 超過該時間,函數必定會執行 6 * */ 7 var throttle = function (fn, delay, mustRunDelay) { 8 var timer; //使用閉包存儲timer 9 var t_start; 10 //閉包返回的函數 11 return function (val) { 12 var args = arguments, t_curr = +new Date(); //使用+new Date() 將字符串轉換成數字 13 clearTimeout(timer); 14 if (!t_start) { // 使用!t_start 若是t_start=undefined或者null 則爲true 15 t_start = t_curr; 16 } 17 if (t_curr - t_start >= mustRunDelay) { 18 fn.apply(null, args); 19 t_start = t_curr; 20 } else { 21 timer = setTimeout(function () { 22 fn.apply(null, args); 23 }, delay); 24 } 25 } 26 }; 27 28 /*使用方法*/ 29 var throttle1 = throttle(fn, 500, 4000); 30 //在該須要調用的函數內部調用此函數 31 throttle1(val); //此處傳人的參數爲以上fn須要傳人的參數
至於函數節流具體的好處,經常使用的場景,如下文章說得很是清楚,我就再也不說啦~javascript
好比一個頁面中有不少圖片,如淘寶首頁等等,一個頁面有100多的圖片,若是一上來就發送這麼多請求,頁面加載就會很漫長,若是js文件都放在了文檔的底部,恰巧頁面的頭部又依賴這個js文件,那就很差辦了。用戶感受這個頁面就會很卡。html
當訪問一個頁面的時候,先把img元素或是其餘元素的背景圖片路徑替換成loading圖片地址(這樣就只需請求一次)java
//即便img的src值爲空,瀏覽器也會對服務器發送請求。因此平時作項目的時候,若是img沒有用到src,就不要出現src這個屬性 git
element.offsetTopgithub
document.documentElement.scrollTop 兼容ie低版本的標準模式 面試
document.body.scrollTop 兼容混雜模式;數組
1 function initElementMap() { 2 var el = document.getElementsByTagName('img'); 3 for (var j = 0, len2 = el.length; j < len2; j++) { 4 //判斷當前的img是否加載過了,或者有lazy_src標誌 [未完成] 5 if (typeof (el[j].getAttribute("lazy_src"))) { 6 element_obj.push(el[j]); 7 download_count++; 8 } 9 } 10 }
2.判斷數組中的img對象,若知足條件,則改變src屬性瀏覽器
1 function lazy() { 2 if (!download_count) return; 3 var innerHeight = getViewport(); 4 for (var i = 0, len = element_obj.length; i < len; i++) { 5 //獲得圖片相對document的距上距離 6 var t_index = getElementViewTop(element_obj[i]); 7 if (t_index - getScrollTop() < innerHeight) { 8 element_obj[i].src = element_obj[i].getAttribute("lazy-src"); 9 delete element_obj[i]; 10 download_count--; 11 } 12 } 13 }
3.滾動的時候觸發事件,1000毫秒後執行lazy()方法。服務器
1 window.onscroll = window.onload = function () { 2 setTimeout(function () { 3 lazy(); 4 }, 1000) 5 }
整部分代碼位於閉包自執行函數中。相應的方法放在init中。閉包
1 var lazyLoad = (function () { 2 function init() { 3 initElementMap(); 4 lazy(); 5 }; 6 return { 7 init: init 8 } 9 })();
使用格式 :src填默認loading圖片地址,真實的圖片地址填在lazy-src屬性裏,切記需指定寬高。在外部調用 lazyLoad.init();