1. 程式人生 > >圖片本地快取

圖片本地快取

圖片懶載入是通過判斷http圖片檔案是否存在你的本地,如果未存在會將圖片快取到本地,如果已經存在就不做快取,使用到的技術md5加密,mui、html5+.

應客戶的要求,需要做懶載入,本人也找了一段時間才找到這個程式碼,因為是非同步載入的,為了配合mui,我添加了mui的初始化程式碼,才可以操作plus,否則會報錯

/**
 * 圖片懶載入
 * @param {Object}   obj       DOMElement
 * @param {Function} callback  載入完成回撥函式
 * 
 * @author fanrong33
 * @version 1.1.0 build 20160107
 */
function lazyload(obj, callback){ mui.plusReady(function(){ var debug = false; // 預設列印除錯日誌 if(obj.getAttribute('data-loaded')){ return; } var image_url = obj.getAttribute('data-lazyload'); debug && console.log(image_url); // 1. 轉換網路圖片地址為本地快取圖片路徑,判斷該圖片是否存在本地快取
// http://...jpg -> md5 // 快取目錄 _downloads/image/(md5).jpg var image_md5 = md5(image_url); var local_image_url = '_downloads/image/'+image_md5+'.jpg'; // 快取本地圖片url var absolute_image_path = plus.io.convertLocalFileSystemURL(local_image_url); // 平臺絕對路徑 // alert(absolute_image_path);
// alert(local_image_url); // alert(image_md5); // new temp_img 用於判斷圖片檔案是否存在 var temp_img = new Image(); temp_img.src = absolute_image_path; temp_img.onload = function(){ debug && console.log('存在本地快取圖片檔案'+local_image_url+',直接顯示'); // 1.1 存在,則直接顯示(本地已快取,不需要淡入動畫) obj.setAttribute('src', absolute_image_path); obj.setAttribute('data-loaded', true); obj.classList.add('img-lazyload'); callback && callback(); return; } temp_img.onerror = function(){ debug && console.log('不存在本地快取圖片檔案'); // 1.2 下載圖片快取到本地 debug && console.log('開始下載圖片'+image_url+' 快取到本地: '+local_image_url); function download_img(){ var download_task = plus.downloader.createDownload(image_url, { filename: local_image_url // filename:下載任務在本地儲存的檔案路徑 }, function(download, status) { if(status != 200){ // 下載失敗,刪除本地臨時檔案 debug && console.log('下載失敗,status'+status); if(local_image_url != null){ plus.io.resolveLocalFileSystemURL(local_image_url, function(entry) { entry.remove(function(entry) { debug && console.log("臨時檔案刪除成功" + local_image_url); // 重新下載圖片 download_img(); }, function(e) { debug && console.log("臨時檔案刪除失敗" + local_image_url); }); }); } }else{ // 把下載成功的圖片顯示 // 將本地URL路徑轉換成平臺絕對路徑 obj.setAttribute('src', plus.io.convertLocalFileSystemURL(local_image_url)); obj.setAttribute('data-loaded', true); obj.classList.add('img-lazyload'); callback && callback(); } }); download_task.start(); } download_img(); } }); }

html程式碼

list_item += '<div class="product-goods-img"><img src="img/libai.jpg" data-lazyload="'+data['floorList'][i]['productList'][j]['ImageUrl']+'"  onload="lazyload(this)" /></div>';
這個專案是我一年之前做的,那時是通過拼接字串,然後append進去,如果是用vue或者angular就不用拼接了,直接在img標籤插入以下程式碼即可data-lazyload(需要懶載入的圖片),onload。

備註:需要引入:

<script src="./js/md5.min.js" type="text/javascript"></script>
<script src="./js/lazyload.js" type="text/javascript"></script>