jQuery 判斷圖片是否加載完成方法匯總
對于圖片的處理,例如幻燈片播放、縮放等,都是依賴于在所有圖片完成之后再進行操作。
今天來看下如何判斷所有的圖片加載完成,而在加載完成之前可以使用 loading 的 gif 圖表示正在加載中。
一、普通方法
監(jiān)聽 img 的 load 方法,每 load 一張圖片比較一次。關(guān)鍵代碼如下:
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的回調(diào)函數(shù)解決方案,它解決了如何處理耗時操作的問題, 對那些操作提供了更好的控制,以及統(tǒng)一的編程接口。
阮一峰有一篇文章是介紹 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.
關(guān)鍵代碼:
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() 當(dāng)所有的 Deferred 完成便執(zhí)行 done()。
注: 因為 $.when 支持的參數(shù)是 $.when(dfd1, dfd2, dfd3, ...),所以我們這里使用了 apply 來接受數(shù)組參數(shù)。
complete判斷圖片是否加載了
感謝谷歌,找到了好使的方法,簡單用法就是:
qim=new Image();//新建一個圖片;
qim.src=$preload;//圖片地址是你準(zhǔn)備要加載的地址;
if(qim.complete){ $("#cxNfloor").html($filetoload);//qim.complete表示這個圖片是否加載完畢了
}
后來又發(fā)現(xiàn)一個方法
$("").load(function(){...});
其中選擇器是圖片的id或class,function里面的方法就是回調(diào)函數(shù),在圖片加載完成后執(zhí)行,但是我試驗了很多,壓根兒不是那么回事,正確的解決方法是:
//jquery的方式
$("#imageId").load(function(){
alert("加載完成!");
});
有朋友說使用js是最好的,方法如下
document.getElementById("img2").onload=function(){}
在網(wǎng)上找到一段代碼
例子
function loadImage(url, callback) {
var img = new Image(); //創(chuàng)建一個Image對象,實現(xiàn)圖片的預(yù)下載
img.src = url;
if(img.complete) { // 如果圖片已經(jīng)存在于瀏覽器緩存,直接調(diào)用回調(diào)函數(shù)
callback.call(img);
return; // 直接返回,不用再處理onload事件
}
img.onload = function () { //圖片下載完畢時異步調(diào)用callback函數(shù)。
callback.call(img);//將回調(diào)函數(shù)的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的不足,不過代碼稍顯復(fù)雜 在性能方面比起window.onload經(jīng)強很多。
相關(guān)文章
jquery提取元素里的純文本不包含span等里的內(nèi)容
如何實現(xiàn)提取元素里的純文本,不包含span等里的內(nèi)容,這就是本文要為大家介紹的重點,你將學(xué)會使用jquery來實現(xiàn)2013-09-09
jQuery中驗證表單提交方式及序列化表單內(nèi)容的實現(xiàn)
之前項目中使用的表單提交方式,使用form()方法可以將提交事件脫離submit按鈕,綁定到任何事件中,下面有個不錯的示例大家可以參考下2014-01-01
根據(jù)郵箱的域名跳轉(zhuǎn)到相應(yīng)的登錄頁面的代碼
其實主要是想記錄一下這種對象的用法,喜歡的朋友可以參考下2012-02-02
jquery實現(xiàn)的讓超出顯示范圍外的導(dǎo)航自動固定屏幕最頂上
經(jīng)常會遇到這樣的情況,當(dāng)頁面展示內(nèi)容過長時,想點導(dǎo)航切換欄目,就得把滾動條拉回到頂上,這樣操作總不太人性化,能不能讓導(dǎo)航超出顯示范圍外時自動貼在屏幕最頂上呢?答案肯定是能的。如果不太明白,把滾動條拉到下面點,看下我博客是效果就明白了。2011-09-09
基于Jquery插件Uploadify實現(xiàn)實時顯示進度條上傳圖片
這篇文章主要介紹了基于Jquery插件Uploadify實現(xiàn)實時顯示進度條上傳圖片的相關(guān)資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05
jQuery動態(tài)添加li標(biāo)簽并添加屬性和綁定事件方法
下面小編就為大家分享一篇jQuery動態(tài)添加li標(biāo)簽并添加屬性和綁定事件方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
基于jQuery實現(xiàn)交互體驗社會化分享代碼附源碼下載
基于jQuery實現(xiàn)交互體驗社會化分享代碼附源碼下載。這是一款鼠標(biāo)點擊分享按鈕向右滑出騰訊微博,新浪微博,QQ空間,豆瓣,微信,二維碼分享等分享平臺,本段代碼比較實用,需要的朋友參考下吧2016-01-01

