由於國內的電信網絡性價比的限制,和手機處理能力的差異,在設計一個無線應用的時候,
為用戶節省流量是一個非常重要的考慮因素。可以說每一個字節都應該為客戶端節省。
節約流量可以從以下幾個方面關注:
一、使用緩存 比如 利用瀏覽器本地存儲 前面已經討論過
二、延遲加載代碼 (觸底檢測,通過接口獲取數據)
三、資源的延遲加載,圖片出現在可視區域再加載,(不考慮自動播放的情況下)音頻視頻按用戶點擊加載。
今天簡單說一下圖片延遲加載的實現方式。
例子基於jQuery 和 jQuery mobile
原理:用戶滑動屏幕,屏幕滾動結束(用jQuery 提供的 window scrollstop 事件合適 ) 檢測出現在viewport中的圖片。
替換圖片的 真正 src 屬性即可。
技巧:滾動結束之后不要立即檢測加載,設置一秒延時,也許用戶會立即開始下一次滾屏,基於現在的網絡環境,1秒的延時可以說明用戶真正想查看這些內容。用微信的朋友可以仔細體驗一下這一點。
由於有時鍾的控制,當用戶頻繁快速翻動屏幕,不會發大量請求。
主要代碼:
var refreshTimer = null, mebook = mebook || {}; /* *滾動結束 屏幕靜止一秒后檢測哪些圖片出現在viewport中 *和PC端不同 由於無線速度限制 和手機運算能力的差異 1秒鍾的延遲對手機端的用戶來說可以忍受 */ $(window).on('scrollstop', function () { if (refreshTimer) { clearTimeout(refreshTimer); refreshTimer = null; } refreshTimer = setTimeout(refreshAll, 1e3); }); $.belowthefold = function (element) { var fold = $(window).height() + $(window).scrollTop(); return fold <= $(element).offset().top; }; $.abovethetop = function (element) { var top = $(window).scrollTop(); return top >= $(element).offset().top + $(element).height(); }; /* *判斷元素是否出現在viewport中 依賴於上兩個擴展方法 */ $.inViewport = function (element) { return !$.belowthefold(element) && !$.abovethetop(element) }; mebook.getInViewportList = function () { var list = $('#bookList li'), ret = []; list.each(function (i) { var li = list.eq(i); if ($.inViewport(li)) { mebook.loadImg(li); } }); }; mebook.loadImg = function (li) { if (li.find('img[_src]').length) { var img = li.find('img[_src]'), src = img.attr('_src'); img.attr('src', src).load(function () { img.removeAttr('_src'); }); } };
手機掃描二維碼: