2009-11-01 11 views
11

Tôi có chức năng jQuery ajax tải một số nội dung vào một div, một số nội dung là hình ảnh. Tôi muốn nói cho đến khi những hình ảnh mà chỉ cần nạp trong ajax của tôi, được tải xong, và THEN chạy một chức năng, chẳng hạn như hiển thị nội dung. Bằng cách này, tôi sẽ không tải nội dung vào div và hình ảnh bắt đầu tải. Tôi muốn chúng được tải, sau đó đặt nội dung hoặc show() nội dung trong div.Biết khi nào hình ảnh được tải xong trong phản hồi AJAX

Tôi đã thấy nhiều giải pháp cho điều này, chẳng hạn như sử dụng .load(), nhưng dường như không hoạt động đối với nội dung đã được tải bằng ajax.

Trả lời

12

Bạn cần thêm trình xử lý tải trong lời gọi AJAX để áp dụng cho hình ảnh đang được tải qua cuộc gọi AJAX. Bạn cũng có thể muốn có bộ hẹn giờ để hiển thị nội dung sau một khoảng thời gian trong trường hợp hình ảnh được tải trước khi trình xử lý tải được áp dụng.

$.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 - Tôi thích phương pháp này rất nhiều. – karim79

+0

Tôi gặp khó khăn khi làm việc này. Bắt một số lỗi js. Có ai có một ví dụ về điều này? –

+0

Tập lệnh này đã hoạt động cho tôi sau khi tôi đã chỉnh sửa ... Xem bài đăng của tôi Dưới đây – bgreater

0

$("img").load() sẽ không hoạt động vì hình ảnh được tải động; lệnh đó sẽ chỉ áp dụng cho hình ảnh trên trang tại thời điểm đó.

sử dụng $("img").live("load") để theo dõi thời điểm tải hình ảnh.

+0

Odd. Tôi sẽ nói rằng live không hỗ trợ tải - và nó có thể không - nhưng sự kiện tải không xuất hiện trong danh sách được hỗ trợ hoặc không được hỗ trợ. Bạn đã thử nghiệm điều này để xem nó có hoạt động không? – tvanfosson

+0

Tôi đã thử: $ ('# productFull img'). (Cảnh báo 'tải', chức năng() { ('tải hình ảnh!'); \t \t }); Nhưng, điều đó dường như không hoạt động. Điều này có cần phải nằm trong phạm vi chức năng ajax không? –

+0

Tôi đã không thử nghiệm nó, và nếu nó không có trong danh sách được hỗ trợ, có một cơ hội tốt nó không được hỗ trợ vì nó sẽ khó khăn cho jQuery thực hiện. – mahemoff

10

Đây là phiên bản cập nhật của mã số tvanfosson được cung cấp.

Bạn phải chắc chắn rằng các biến imageCount được đếm một danh sách nút và không phải là một chuỗi như là vấn đề trong mã gốc từ tôi có thể suy ra:

$.ajax({ 
    url  : 'somePage.html', 
    dataType : "html", 
    success : function(data) { 

     $(data).hide().appendTo('#someDiv'); 

     var imagesCount = $('#someDiv').find('img').length; 
     var imagesLoaded = 0; 

     $('#someDiv').find('img').load(function() { 
      ++imagesLoaded; 
      if (imagesLoaded >= imagesCount) { 
       $('#someDiv').children().show(); 
      } 
     }); 

     var timeout = setTimeout(function() { 
      $('#someDiv').children().show(); 
     }, 5000); 
    }      
}); 
+0

Tôi không hiểu tại sao '++ imagesLoaded' sẽ hoạt động. '.load()' dường như không lặp lại, nếu có, thì khi có nhiều hình ảnh, sẽ không '$ ('# someDiv'). find ('img'). load' chỉ kích hoạt một lần cho hình ảnh đầu tiên ? – shenkwen

+0

@shenkwen đó là b/c một sự kiện tải được thêm vào mỗi phần tử được trả về từ bộ chọn jQuery. Nếu đó là nhiều hình ảnh thì nhiều chức năng gọi lại sẽ được thực hiện và vì var 'imagesLoaded' được định nghĩa bên ngoài gọi lại, nó sẽ lặp lại. – bgreater