2011-04-11 28 views
14

Tôi có một số mã jQuery khá cơ bản:jQuery .load() không bắn vào hình ảnh (có thể là bộ nhớ đệm?)

... 
$(this).find('img').load(function(){ 
    loadedImages++; 
    if(loadedImages == $this.find('img').length){ 
... 

Tuy nhiên, thats không bắn liên tục. Nó sẽ kích hoạt nếu tôi thực hiện làm mới hoặc đóng trình duyệt của tôi, nhưng làm mới bình thường hoặc chỉ cần nhấn cùng một URL hai lần bất kỳ lúc nào mà không xóa bộ nhớ cache làm cho .load() không bao giờ kích hoạt.

Bất kỳ ý tưởng nào về cách sửa lỗi này?

+0

Xem câu trả lời có liên quan [ở đây] (http://stackoverflow.com/questions/126772/how-to-force-a-web-browser-not-to-cache-images) –

+0

Điều đó đã cảm ơn! Xem câu trả lời cụ thể hơn của tôi sau khi đọc những câu trả lời đó! –

Trả lời

4

Một cách sẽ là thêm "biến giả" ở cuối URL mà bạn sử dụng để lấy hình ảnh ... chẳng hạn như thời gian tính bằng mili giây được nối với tham số chuỗi truy vấn.

+0

Hoàn hảo, đã hoạt động! –

+0

Đó không phải là thô, đó là thực tế phổ biến. :) –

+0

@Diodeus - Rất đúng ... Tôi sẽ chỉnh sửa bài đăng để nó trông không bị ảnh hưởng ... cảm ơn. –

3

Như Ron và El Guapo cho biết, câu trả lời là thêm truy vấn ở cuối URL. Tôi đã làm như sau:

$(this).find('img').each(function(){ 
    $(this).attr('src',$(this).attr('src')+'?'+new Date().getTime()) 
}).load(function(){ 
    //This will always run now! 
+0

Công việc tuyệt vời minh họa điều này !!!! –

+3

Trong khi điều này không trả lời được câu hỏi ban đầu, nó ngăn hình ảnh của bạn được lưu vào bộ nhớ cache bởi trình duyệt, không lý tưởng vì nó sẽ làm chậm tải trang. –

40

Tôi nghĩ điều này has been discussed before. Nó không phải là bộ nhớ đệm cho mỗi se đó là vấn đề nhưng thời gian: những hình ảnh có thể đã được tải bởi thời gian xử lý sự kiện được đính kèm (vì vậy nó không bao giờ bị sa thải). Điều này cũng có thể xảy ra nếu không có bộ nhớ đệm xảy ra, ví dụ trong một trình duyệt đa luồng trên một kết nối rất nhanh. May mắn thay, có một tài sản .complete mà bạn có thể sử dụng:

var load_handler = function() { 
    loadedImages++; 
    … 
} 
$(this).find('img').filter(function() { 
    return this.complete; 
}).each(load_handler).end().load(load_handler); 

Bạn cũng có thể tạo sự kiện riêng của bạn đính kèm chức năng:

jQuery.fn.extend({ 
    ensureLoad: function(handler) { 
     return this.each(function() { 
      if(this.complete) { 
       handler.call(this); 
      } else { 
       $(this).load(handler); 
      } 
     }); 
    } 
}); 

Và sau đó gọi nó như sau:

$(this).find('img').ensureLoad(function(){ 
    loadedImages++; 
    if(loadedImages == $this.find('img').length){ 
    … 
}); 
+0

Trong trường hợp bạn đang tự động thay đổi 'src' của hình ảnh và dựa vào" tải "sự kiện để làm điều gì đó với nó khi nó tải, bạn có thể kích hoạt tải theo cách thủ công nếu hình ảnh trong bộ nhớ cache đã được như vậy:' image.attr (' src ', ); if (image [0] .complete) {image.trigger ('load')} ' – hakunin

+1

Đây là một giải pháp rất thanh lịch, một câu trả lời tốt hơn so với câu trả lời được chấp nhận. Một trong đó đã được chấp nhận là một giải pháp thô nhưng nó cũng ngăn chặn bộ nhớ đệm. Trong ứng dụng của tôi, có 30 ảnh có độ phân giải cao hiển thị, vì vậy tôi gặp sự cố khi tải đầu tiên mất một lúc cho đến khi tất cả ảnh được tải và kích thước được tính (kích thước khác nhau mỗi lần) và khi truy cập lại, bộ nhớ cache khiến tải() không cháy hết. Nếu tôi vô hiệu hóa bộ nhớ đệm, sẽ mất nhiều thời gian để tải mỗi khi khách truy cập đến. – jeffkee

Các vấn đề liên quan