Yüklenen görüntüler için jQuery olayı


96

Tüm görüntülerin bir jQuery olayı aracılığıyla yüklendiğini tespit etmek mümkün müdür?

İdeal olarak, bir

$(document).idle(function()
{
}

veya

$(document).contentLoaded(function()
{
}

Ama ben böyle bir şey bulamıyorum.

Bunun gibi bir olay eklemeyi düşündüm:

$(document).ready(function()
{
    var imageTotal = $('img').length;
    var imageCount = 0;        
    $('img').load(function(){if(++imageCount == imageTotal) doStuff();});
}

Ancak bir görüntü yüklenemezse bu kırılır mı? Yöntemin doğru zamanda çağrılması kritik derecede önemlidir.


9
Neden onload olayını kullanmıyorsunuz: $ (pencere) .load (doStuff)? Bununla birlikte, onload, sizin için uygun olan veya olmayan resimleri değil, diğer kaynakları da (örneğin komut dosyaları, stil sayfaları ve flash) bekleyecektir.
moff

Kod örneğinizde olduğu gibi, tüm img etiketlerinize bir yükleme olayı eklemek işlevsel olmalıdır. Bir görüntü yüklenemezse doStuff () çağrılmaz, ancak tüm görüntülerin yüklenmesi gerektiğine göre bu mantıklı görünüyor.
Steve Goodman

2
.Load () yöntemi jQuery 1.8'den beri kullanımdan kaldırılmıştır.
Şuna bir

Yanıtlar:


116

JQuery'nin belgelerine göre , load olayını görüntülerle kullanmak için bir dizi uyarı vardır. Başka bir yanıtta belirtildiği gibi, ahpi.imgload.js eklentisi bozuk, ancak bağlantılı Paul Irish özü artık korunmuyor.

Paul Irish'e göre, görüntü yükleme tamamlanma olaylarını tespit etmek için kanonik eklenti şu anda:

https://github.com/desandro/imagesloaded


4
Bu cevap; birden çok görüntüyü, önbelleğe alınmış görüntüleri, tarayıcı tuhaflıklarını, bozuk görüntüleri ele alıyor ve güncel. Güzel.
Yarin

7
bugün test etti. 2 dakika içinde hazır ve çalışıyordu.
CodeToad

@Yarin, iyi dokümantasyon, kullanımı kolay, çoklu, önbelleğe alınmış, bozuk ve güncel ile aynı fikirde. Sevdim.
johntrepreneur


1
Görüntüleri almak için hızlı ve basit bir 2 satırlık düzeltme IE7'de yüklü çalışma .
johntrepreneur

63

Tüm resimleri değil, belirli birini (ör. DOM zaten tamamlandıktan sonra dinamik olarak değiştirdiğiniz bir resim) kontrol etmek istiyorsanız, şunu kullanabilirsiniz:

$('#myImage').attr('src', 'image.jpg').on("load", function() {  
  alert('Image Loaded');  
});  

70
Dikkatli olun, çünkü load()bir görüntü zaten yüklendiğinde tetiklenmeyecektir. Bu, kullanıcının tarayıcısının önbelleğinde bir görüntü olduğunda kolayca gerçekleşebilir. Kullanarak bir görüntünün önceden yüklenip yüklenmediğini kontrol edebilirsiniz $('#myImage').prop('complete'), bu görüntü yüklendiğinde true döndürür.
Blaise

6
Bunun yanı sıra a) sorusuna cevap vermiyor ve b) kötü bir çözüm varken neden bu kadar çok oy alıyor? (Doğru cevap @ johnpolacek'in ve 1 oya sahip olduğu anlamına gelir)
Yarin

5
UYARI!!!!!!!!!!!!!!! Bu doğru cevap değil. johnpolacek doğru cevaba sahip. Lütfen cevabını oylayın.
mrbinky3000

4
Bu itirazlar, çok özel bir durum dışında artık alakalı görünmüyor: Bir görüntünün src'sini eskisi gibi tam olarak aynı src'ye değiştirdiğinizde Webkit. DOM'a yeni eklediğiniz resimler için $ (...). Load () yeterli olmalıdır. Mevcut FF ve Chrome'da ve IE6-9'da test edilmiştir: jsfiddle.net/b9chris/tXVCe/2
Chris

1
+1 Görüntü tarayıcının önbelleğinde olmadığında (biliyorsunuz) iyi çalışır.
Lode

28

Benim eklentisi kullanabilirsiniz waitForImages bu işlemek için ...

$(document).waitForImages(function() {
   // Loaded.
});

Bunun avantajı, onu bir üst öğeye yerelleştirebilmeniz ve isteğe bağlı olarak CSS'de referans verilen görüntüleri algılayabilmesidir.

Bu buzdağının sadece görünen kısmı, daha fazla işlevsellik için belgelere bakın.


Merhaba Alex, umut verici görünüyor. Ancak johnpolacek ve hirisov tarafından verilen cevaplarda ve yorumlarda belirtildiği gibi, görüntü zaten tarayıcı önbelleğinde olduğunda durumu kapsıyor mu?
SexyBeast

Bir görüntü oluşturan ve sayfa yüklendikten sonra onu dinamik olarak yükleyen bir işlemim var ve kullanıcı beklerken bir ajax yükleyici göstermem gerekiyordu. Bu eklenti, bu kullanım durumu için mükemmel çalışıyor. Ancak img src özelliğini ayarladıktan sonra işlevi çağırmalısınız!
John Livermore

20

JQuery $ (). Load () öğesinin bir IMG olay işleyicisi olarak kullanılması garanti edilmez. Görüntü önbellekten yüklenirse, bazı tarayıcılar olayı tetiklemeyebilir. Safari'nin (daha eski?) Sürümleri söz konusu olduğunda, bir IMG öğesinin SRC özelliğini aynı değere değiştirdiyseniz , onload olayı tetiklenmeyecektir.

Bunun en son jQuery'de (1.4.x) - http://api.jquery.com/load-event - alıntı yapmak için tanındığı görülüyor :

Görüntü tarayıcı önbelleğinden yüklenirse yükleme olayının tetiklenmemesi mümkündür. Bu olasılığı hesaba katmak için, görüntü hazır olduğunda hemen tetiklenen özel bir yükleme olayı kullanabiliriz. event.special.load şu anda bir eklenti olarak mevcuttur.

Artık bu durumu ve IE'nin IMG öğesi yükleme durumları için "eksiksiz" özelliğini tanıyan bir eklenti var: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js


16

Gereğince bu cevap , kullanabileceğiniz jQuery yük olay üzerine windowyerine nesne document:

jQuery(window).load(function() {
    console.log("page finished loading now.");
});

Bu, sayfadaki tüm içerik yüklendikten sonra tetiklenecektir. Bu jQuery(document).load(...), DOM yüklemeyi bitirdikten sonra tetiklenenden farklıdır .


Bu tam olarak aradığım şey!
Eric K

4

imagesLoaded Plugin, çapraz tarayıcı çözümüne ihtiyacınız varsa gitmenin yoludur

 $("<img>", {src: 'image.jpg'}).imagesLoaded( function( $images, $proper, $broken ){
 if($broken.length > 0){
 //Error CallBack
 console.log('Error');
 }
 else{
 // Load CallBack
 console.log('Load');
 }
 });

Yalnızca Bir IE WorkAround'a İhtiyacınız Varsa, Bu İşe Yarar

 var img = $("<img>", {
    error: function() {console.log('error'); },
    load: function() {console.log('load');}
    });
  img.attr('src','image.jpg');


2

Aynı kökenli görseller için şunları kullanabilirsiniz:

$.get('http://www.your_domain.com/image.jpg', imgLoaded);

function imgLoaded(){
    console.log(this, 'loaded');
}


0
  function CheckImageLoadingState()
  {
     var counter = 0;
     var length = 0;

     jQuery('#siteContent img').each(function() 
     {
        if(jQuery(this).attr('src').match(/(gif|png|jpg|jpeg)$/))
          length++;
     });

     jQuery('#siteContent img').each(function() 
     {  
        if(jQuery(this).attr('src').match(/(gif|png|jpg|jpeg)$/))
        {
           jQuery(this).load(function() 
           {
           }).each(function() {
              if(this.complete) jQuery(this).load();
            });
        }
        jQuery(this).load(function()
        {
           counter++;
           if(counter === length) 
           {  
              //function to call when all the images have been loaded
              DisplaySiteContent();
           }
        });
     });
  }

0
$( "img.photo" ).load(function() {

    $(".parrentDiv").css('height',$("img.photo").height());
    // very simple

}); 

0

Kendi betiğimi yarattım, çünkü çok fazla eklenti buldum ve sadece istediğim gibi çalışmasını istedim. Benimki, her görüntünün bir yüksekliği olup olmadığını (yerel görüntü yüksekliği) kontrol eder. Önbelleğe alma sorunlarını çözmek için bunu $ (window) .load () işleviyle birleştirdim.

Kodum oldukça yoğun bir şekilde yorumlandı, bu yüzden kullanmasanız bile bakmak ilginç olmalı. Benim için mükemmel çalışıyor.

Daha fazla uzatmadan, işte burada:

imgLoad.js komut dosyası


0

Tüm resimlerin yüklenmesini bekliyorum ...
jfriend00 ile ilgili sorunumun cevabını burada buldum jquery: bir konteyner div'in imaj yüklenme olayını nasıl dinleyebilirim? .. ve "if (this.complete)"
Her şeyin yüklenmesi ve bazılarının muhtemelen önbellekte olmasını bekliyorum! .. ve "error" olayını ekledim ... tüm tarayıcılarda sağlam

$(function() { // Wait dom ready
    var $img = $('img'), // images collection
        totalImg = $img.length,
        waitImgDone = function() {
            totalImg--;
            if (!totalImg) {
                console.log($img.length+" image(s) chargée(s) !");
            }
        };
    $img.each(function() {
        if (this.complete) waitImgDone(); // already here..
        else $(this).load(waitImgDone).error(waitImgDone); // completed...
    });
});

Demo: http://jsfiddle.net/molokoloco/NWjDb/


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.