image.onload olayı ve tarayıcı önbelleği


113

Bir resim yüklendikten sonra bir uyarı kutusu oluşturmak istiyorum, ancak resim tarayıcı önbelleğine kaydedilirse .onloadolay tetiklenmeyecektir.

Bir görüntü yüklendiğinde, görüntünün önbelleğe alınıp alınmadığına bakılmaksızın nasıl uyarı tetiklerim?

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

Yanıtlar:


153

Görüntüyü dinamik olarak oluştururken, onloadözelliği src.

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

Fiddle - en son Firefox ve Chrome sürümlerinde test edildi.

Ayrıca , dinamik olarak oluşturulmuş tek bir görsel için uyarladığım bu gönderideki cevabı da kullanabilirsiniz :

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

Vaktini boşa harcamak


Bekle. İkinci kod örneğiniz neden yanlış bir şey yapıyor ve .src.onload ayarlamadan önce ayarlanıyor? İlk kod örneğinde haklıydın, ancak ikincisini mahvettin. İkincisi, IE'nin bazı sürümlerinde düzgün çalışmayacaktır.
jfriend00

1
@ jfriend00 Hayır, karışıklık değil. Yedekleme kodu (2. kod) tam olarak ilkinin bir şekilde çalışmayı bırakması durumunda geçerlidir. Görüntünün önceden önbelleğe alınmış olması durumunda =]bir .completekontrol kullanır , dolayısıyla kod bunu gösterir. Elbette, en iyi uygulama için, her zaman srcsonra tüm işleyiciler bağlamayı ayarlayabilirsiniz .
Fabrício Matté

4
.completeBu durumda güvenmek için hiçbir neden yok . Yük alma malzemenizi ayarlamadan önce ayarlayın .srcve ASLA gerekli değildir. Akla gelebilecek her tarayıcıda binlerce site tarafından kullanılan bir slayt gösterisi yazdım ve ilk teknik her seferinde işe yarıyor. Böyle .completesıfırdan yeni bir görüntü oluşturduğunuzda kontrol etmeye gerek yoktur .
jfriend00

Pekala, uyarı için teşekkürler, mantığınızı yansıtacak şekilde cevabı güncelledi =]. Ayrıca @ jfriend00, görüntünün IE'ye yüklenip yüklenmediğini kontrol edebilir misiniz? Ağımla mı yoksa IE ve görüntüyle mi ilgili bir sorun olduğunu merak ediyorum.
Fabrício Matté

9
Ayrıca bugün webkit'in daha img.src = ''önce kullanılmışsa yeni src atamadan önce ihtiyacı olduğunu öğrendim .
quux

10

Src zaten ayarlanmışsa, siz olay işleyicisini bağlamadan önce olay önbelleğe alınmış durumda tetikleniyor demektir. Yani, olayı da temel alarak tetiklemelisiniz .complete.

kod örneği:

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

6

Bu tür durumlar için iki olası çözüm vardır:

  1. Bu gönderide önerilen çözümü kullanın
  2. srcTarayıcının onu tekrar indirmeye zorlamak için resme benzersiz bir son ek ekleyin , örneğin:

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

Bu kodda, görsel URL'sinin sonuna geçerli zaman damgasını her eklediğinizde, onu benzersiz kılarsınız ve tarayıcı, görseli tekrar indirir.


44
Bütün bunlar yenilgi önbelleğe almaktır. Bu sorunu çözmenin YANLIŞ yolu budur. Doğru yol, Fabricio'nun cevabında. Değeri .onloadayarlamadan önce işleyiciyi ayarlayın ve .srcIE'nin bazı sürümlerinde onload olayını kaçırmayacaksınız.
jfriend00

1
evet haklısınız, ancak her zaman önbelleğe almak istenmez, bazen görüntüler önbelleğe alınmamalıdır. elbette bu özel durumda ihtiyaçlara bağlıdır
haynar

1
Açısal uygulamamda, diğer yanıtların söylediği her şeyi denedim, ancak yardımcı olmadım. Ancak bu cevap gibi önbelleğe almamaya zorlamak benim için işe yaradı. Yani artı benden.
Thanu

En son sürüm Chrome'da benim için çalışan tek çözüm.
Young Bob

3

Bugün aynı sorunla karşılaştım. Çeşitli yöntemleri denedikten sonra , sorunun bir kısmını çözmek $(window).load(function() {})yerine boyutlandırma kodunu içeri document.readykoymanın (sayfayı ajaxlamıyorsanız) fark ettim.


Bu aynı zamanda tarayıcının önbelleğe alınan görüntünün olduğu durum için iyi bir cevaptır, pencere yüklemesiyle sorunsuz çalışır
Shocker

tam olarak karşı karşıya olduğum sorun. sorunumu çözmek $(document).readyiçin değişiyor $(window).load.
Tarıkul İslam

0

Bunu Chrome'da yapabileceğinizi öğrendim:

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

.Src'nin kendisine ayarlanması, onload olayını tetikleyecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.