2009-11-01 76 views
11

我有一個jQuery ajax函數,將一些內容加載到div中,其中一些內容是圖像。我想說,直到那些剛剛加載到我的ajax中的圖像完成加載,然後運行一個函數(如顯示內容)。這樣,我就不會將內容加載到div中並且圖像開始加載。我希望他們被加載,然後把內容,或show()的內容在div中。知道何時完成圖像加載AJAX響應

我已經看到很多解決方案,例如使用​​,但它似乎不適用於使用ajax加載的內容。

回答

12

您需要在AJAX回調中添加裝載處理程序,以使其適用於通過AJAX調用加載的圖像。您可能還希望設置一個計時器,以便在應用裝載處理程序之前加載圖像以顯示內容。

$.ajax({ 
    ... 
    success: function(data) { 
      var imageCount = $(data).filter('img').length; 
      var imagesLoaded = 0; 
      $(data).hide() 
       .appendTo('#someDiv') 
       .filter('img') 
       .load(function() { 
        ++imagesLoaded; 
        if (imagesLoaded >= imageCount) { 
         $('#someDiv').children().show(); 
        } 
        }); 
      setTimeout(function() { $('#someDiv').children().show() }, 5000); 
     } 
}); 
+2

+1 - 我非常喜歡這種方法。 – karim79 2009-11-01 21:00:20

+0

我很難得到這個工作。獲取一些js錯誤。有沒有人有這樣的例子? – 2009-11-01 21:20:46

+0

這個腳本在我調整它之後爲我工作...看我的帖子在 – bgreater 2010-06-08 16:49:31

0

$("img").load()將不起作用,因爲圖像是動態加載的;該命令將僅適用於當時頁面上的圖像。

使用$("img").live("load")來跟蹤圖像何時加載。

+0

奇。我想說live不支持加載 - 它可能不會 - 但加載事件不會出現在受支持或不受支持的列表中。你有沒有測試過,看它是否有效? – tvanfosson 2009-11-01 20:42:18

+0

我想: $( '#productFull IMG')生活( '負荷',函數(){ 警報( '形象裝!'); \t \t }); 但是,這似乎並沒有工作。這是否需要在ajax函數的範圍內? – 2009-11-01 20:44:50

+0

我沒有測試過它,如果它不在支持的列表中,它很可能不被支持,因爲jQuery很難實現。 – mahemoff 2009-11-01 20:47:45

10

這是最新版本的代碼tvanfosson提供的。

你必須確保imageCount變量計算節點列表,而不是一個字符串在原代碼的問題,從我可以推斷出:

​​
+0

我不明白爲什麼'++ imagesLoaded'可以工作。 '.load()'似乎沒有迭代,如果是這樣的話,那麼當有多個圖像時,不會有'$('#someDiv')。find('img')。load'只會觸發第一個圖像? – shenkwen 2015-08-15 12:50:31

+0

@shenkwen它的B/C加載事件被添加到從jQuery選擇器返回的每個元素。如果這是多個圖像,則會執行多個回調函數,並且由於'imagesLoaded' var在回調之外定義,它將迭代。 – bgreater 2015-09-02 13:58:08