jQuery 判斷圖片是否載入完成方法匯總_jquery

來源:互聯網
上載者:User

對於圖片的處理,例如投影片播放、縮放等,都是依賴於在所有圖片完成之後再進行操作。

今天來看下如何判斷所有的圖片載入完成,而在載入完成之前可以使用 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經強很多。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.