sự kiện image.onload và bộ nhớ cache của trình duyệt


112

Tôi muốn tạo một hộp cảnh báo sau khi hình ảnh được tải, nhưng nếu hình ảnh được lưu trong bộ nhớ cache của trình duyệt, .onloadsự kiện sẽ không được kích hoạt.

Làm cách nào để kích hoạt cảnh báo khi một hình ảnh đã được tải bất kể hình ảnh đó đã được lưu vào bộ nhớ đệm hay chưa?

var img = new Image();
img.src = "img.jpg";
img.onload = function () {
   alert("image is loaded");
}

Câu trả lời:


152

Khi bạn đang tạo hình ảnh động, hãy đặt thuộc onloadtính trước src.

var img = new Image();
img.onload = function () {
   alert("image is loaded");
}
img.src = "img.jpg";

Fiddle - được thử nghiệm trên các bản phát hành Firefox và Chrome mới nhất.

Bạn cũng có thể sử dụng câu trả lời trong bài đăng này , mà tôi đã điều chỉnh cho một hình ảnh được tạo động duy nhất:

var img = new Image();
// 'load' event
$(img).on('load', function() {
  alert("image is loaded");
});
img.src = "img.jpg";

Vĩ cầm


Chờ đợi. Tại sao ví dụ mã thứ hai của bạn làm sai điều và đặt .srctrước khi đặt .onload? Bạn đã có nó ngay trong ví dụ mã đầu tiên, nhưng lại làm hỏng ví dụ thứ hai. Cái thứ hai sẽ không hoạt động bình thường trong một số phiên bản IE.
jfriend00 10/09/12

1
@ jfriend00 Không, không lộn xộn đâu. Mã dự phòng (mã thứ hai) là chính xác trong trường hợp mã đầu tiên bằng cách nào đó ngừng hoạt động. =]Nó sử dụng .completekiểm tra trong trường hợp hình ảnh đã được lưu vào bộ nhớ cache, do đó mã đang thể hiện nó. Tất nhiên, để thực hành tốt nhất, bạn luôn có thể đặt srcràng buộc sau tất cả các trình xử lý.
Fabrício Matté

4
Không có lý do gì để dựa vào .completetrong trường hợp này. Chỉ cần đặt trình xử lý tải của bạn trước khi thiết lập .srcvà nó KHÔNG BAO GIỜ cần thiết. Tôi đã viết một trình chiếu được hàng nghìn trang web sử dụng trong mọi trình duyệt có thể hình dung được và kỹ thuật đầu tiên luôn hoạt động. Không cần phải kiểm tra .completekhi tạo một hình ảnh mới từ đầu như thế này.
jfriend00 10/09/12

Được rồi, cảm ơn các bạn đã cập nhật câu trả lời để phản ánh lý do của bạn =]. Ngoài ra @ jfriend00, bạn có thể kiểm tra xem hình ảnh có tải trong IE không? Tự hỏi nếu đó là sự cố với mạng của tôi hoặc với IE và hình ảnh.
Fabrício Matté

9
Ngoài ra hôm nay tôi thấy rằng webkit cần phải img.src = ''gán src mới nếu nó đã được sử dụng trước đó.
quux

10

Nếu src đã được đặt thì sự kiện sẽ kích hoạt trong trường hợp được lưu trong bộ nhớ cache trước khi bạn nhận được ràng buộc trình xử lý sự kiện. Vì vậy, bạn cũng nên kích hoạt sự kiện dựa trên .complete.

mẫu mã:

$("img").one("load", function() {
   //do stuff
}).each(function() {
   if(this.complete || /*for IE 10-*/ $(this).height() > 0)
     $(this).load();
});

6

Có hai giải pháp khả thi cho những tình huống này:

  1. Sử dụng giải pháp được đề xuất trên bài đăng này
  2. Thêm một hậu tố duy nhất vào hình ảnh srcđể buộc trình duyệt tải xuống lại hình ảnh , như sau:

    var img = new Image();
    img.src = "img.jpg?_="+(new Date().getTime());
    img.onload = function () {
        alert("image is loaded");
    }
    

Trong mã này, mỗi khi thêm dấu thời gian hiện tại vào cuối URL hình ảnh, bạn đặt nó là duy nhất và trình duyệt sẽ tải lại hình ảnh xuống


44
Tất cả điều này là đánh bại bộ nhớ đệm. Đó là cách SAI để giải quyết vấn đề này. Cách đúng đắn nằm trong câu trả lời của Fabricio. Chỉ cần đặt .onloadtrình xử lý trước khi đặt .srcgiá trị và bạn sẽ không bỏ lỡ sự kiện tải trong một số phiên bản IE.
jfriend00 10/09/12

1
vâng, bạn nói đúng, nhưng không phải lúc nào cũng mong muốn cache, đôi khi hình ảnh không nên cache. tất nhiên trong tình huống cụ thể này, nó phụ thuộc vào nhu cầu
haynar

1
Trong ứng dụng góc cạnh của mình, tôi đã thử mọi thứ mà các câu trả lời khác nói, nhưng không giúp được gì. Nhưng buộc không lưu vào bộ nhớ cache như câu trả lời này nói đã làm việc cho tôi. Vì vậy, cộng với một từ tôi.
Thanu

Giải pháp duy nhất phù hợp với tôi trong Chrome phiên bản mới nhất.
Young Bob

3

Tôi đã gặp vấn đề tương tự ngày hôm nay. Sau khi thử nhiều phương pháp khác nhau, tôi nhận ra rằng chỉ cần đặt mã định cỡ bên trong $(window).load(function() {})thay vì đặt mã document.readysẽ giải quyết một phần vấn đề (nếu bạn không truy cập trang).


Đây cũng là một câu trả lời tốt cho tình huống trình duyệt có hình ảnh được lưu trong bộ nhớ cache, hoạt động tốt với tải cửa sổ
Shocker

chính xác vấn đề tôi đang phải đối mặt. thay đổi $(document).readyđể $(window).loadgiải quyết vấn đề của tôi.
Tariqul Islam

0

Tôi thấy rằng bạn có thể thực hiện việc này trong Chrome:

  $('.onload-fadein').each(function (k, v) {
    v.onload = function () {
        $(this).animate({opacity: 1}, 2000);
    };
    v.src = v.src;
});

Đặt .src thành chính nó sẽ kích hoạt sự kiện tải.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.