對於圖片的處理,例如投影片播放、縮放等,都是依賴於在所有圖片完成之後再進行操作。
今天來看下如何判斷所有的圖片載入完成,而在載入完成之前可以使用 loading 的 gif 圖表示正在載入中。
一、普通方法
監聽 img 的 load 方法,每 load 一張圖片比較一次。關鍵代碼如下:
var num = $img.length;$imgs.load(function() { num--; if (num > 0) { return; } console.log('load compeleted');}
二、使用 jQuery 中的 Deferred 對象
Deferred 對象是從 jQuery 1.5.0 版本開始引入的一個新功能,詳細介紹可以見 官方文檔。
簡單的說,Deferred 對象就是jQuery的回呼函數解決方案,它解決了如何處理耗時操作的問題, 對那些操作提供了更好的控制,以及統一的編程介面。
阮一峰有一篇文章是介紹 Deferred 對象的,寫的比較詳細,對於入門比較有用。
jQuery的deferred對象詳解
在這裡,我們用到了:
deferred.resolve(): Resolve a Deferred object and call any doneCallbacks with the given args.
deferred.when(): Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.
deferred.done(): Add handlers to be called when the Deferred object is resolved.
關鍵代碼:
var defereds = [];$imgs.each(function() { var dfd = $.Deferred(); $(this).load(dfd.resolve); defereds.push(dfd);});$.when.apply(null, defereds).done(function() { console.log('load compeleted');});
基本思路:
每載入完一張圖片 resolve(),when() 當所有的 Deferred 完成便執行 done()。
註: 因為 $.when 支援的參數是 $.when(dfd1, dfd2, dfd3, ...),所以我們這裡使用了 apply 來接受數組參數。
complete判斷圖片是否載入了
感謝Google,找到了好使的方法,簡單用法就是:
qim=new Image();//建立一個圖片;qim.src=$preload;//圖片地址是你準備要載入的地址;if(qim.complete){ $("#cxNfloor").html($filetoload);//qim.complete表示這個圖片是否載入完畢了}
後來又發現一個方法
$("").load(function(){...});
其中選取器是圖片的id或class,function裡面的方法就是回呼函數,在圖片載入完成後執行,但是我實驗了很多,壓根兒不是那麼回事,正確的解決方案是:
//jquery的方式$("#imageId").load(function(){ alert("載入完成!");});
有朋友說使用js是最好的,方法如下
複製代碼 代碼如下:
document.getElementById("img2").onload=function(){}
在網上找到一段代碼
例子
function loadImage(url, callback) { var img = new Image(); //建立一個Image對象,實現圖片的預下載 img.src = url; if(img.complete) { // 如果圖片已經存在於瀏覽器緩衝,直接調用回呼函數 callback.call(img); return; // 直接返回,不用再處理onload事件 } img.onload = function () { //圖片下載完畢時非同步呼叫callback函數。 callback.call(img);//將回呼函數的this替換為Image對象 };};
下面是針對多個image的載入判斷。
var imgdefereds=[];$('img').each(function(){ var dfd=$.Deferred(); $(this).bind('load',function(){ dfd.resolve(); }).bind('error',function(){ //圖片載入錯誤,加入錯誤處理 // dfd.resolve(); }) if(this.complete) setTimeout(function(){ dfd.resolve(); },1000); imgdefereds.push(dfd);})$.when.apply(null,imgdefereds).done(function(){ callback();});
使用這種方法就可以避免window.onload的不足,不過代碼稍顯複雜 在效能方面比起window.onload經強很多。