jQuery-Ereignis für geladene Bilder

96

Kann erkannt werden, wann alle Bilder über ein jQuery-Ereignis geladen wurden?

Idealerweise sollte es eine geben

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

oder

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

Aber ich kann so etwas nicht finden.

Ich dachte daran, ein Ereignis wie dieses anzuhängen:

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

Aber wird dies unterbrochen, wenn ein Bild nicht geladen werden kann? Es ist von entscheidender Bedeutung, dass die Methode zum richtigen Zeitpunkt aufgerufen wird.

Antony Carthy
quelle
9
Warum verwenden Sie nicht das Onload-Ereignis: $ (Fenster) .load (doStuff)? Onload wartet jedoch auch auf andere Ressourcen (z. B. Skripte, Stylesheets und Flash) und nicht nur auf Bilder, die für Sie möglicherweise in Ordnung sind oder nicht.
Moff
Das Anhängen eines Ladeereignisses an alle Ihre img-Tags, wie Sie es in Ihrem Codebeispiel haben, sollte funktionsfähig sein. Wenn ein Bild nicht geladen werden kann, wird doStuff () nicht aufgerufen. Dies erscheint jedoch angesichts der Anforderung, dass alle Bilder geladen werden müssen, sinnvoll.
Steve Goodman
2
Die .load () -Methode ist seit jQuery 1.8 veraltet. Überprüfen Sie dies heraus: stackoverflow.com/questions/3877027/…
fiorix

Antworten:

116

Gemäß der Dokumentation von jQuery gibt es eine Reihe von Einschränkungen für die Verwendung des Ladeereignisses mit Bildern. Wie in einer anderen Antwort erwähnt, ist das Plugin ahpi.imgload.js defekt, aber der verknüpfte Kern von Paul Irish wird nicht mehr beibehalten.

Laut Paul Irish ist das kanonische Plugin zum Erkennen von Ereignissen beim vollständigen Laden von Bildern jetzt verfügbar unter:

https://github.com/desandro/imagesloaded

Johnpolacek
quelle
4
Dies ist die Antwort - behandelt mehrere Bilder, zwischengespeicherte Bilder, Browser-Macken, fehlerhafte Bilder und ist aktuell. Wunderschönen.
Yarin
7
habe es heute getestet. war in 2 Minuten einsatzbereit.
CodeToad
Stimmen Sie mit @Yarin überein, gute Dokumentation, einfach zu bedienen, mehrfach, zwischengespeichert, kaputt und aktuell. Liebe es.
johntrepreneur
Auf der anderen Seite unterstützt imagesLoaded IE7 jedoch nicht, wenn dies für Sie wichtig ist.
johntrepreneur
1
Eine schnelle und einfache zweizeilige Lösung, mit der imagesLoaded auf IE7 funktioniert .
johntrepreneur
63

Wenn Sie nicht nach allen Bildern suchen möchten, sondern nach einem bestimmten (z. B. einem Bild, das Sie dynamisch ersetzt haben, nachdem DOM bereits abgeschlossen ist), können Sie Folgendes verwenden:

$('#myImage').attr('src', 'image.jpg').on("load", function() {  
  alert('Image Loaded');  
});  
rsc
quelle
70
Seien Sie vorsichtig, da dies load()nicht ausgelöst wird, wenn ein Bild bereits geladen ist. Dies kann leicht passieren, wenn sich ein Bild im Browser-Cache des Benutzers befindet. Sie können überprüfen, ob ein Bild bereits mit geladen wurde. Dies $('#myImage').prop('complete')gibt true zurück, wenn ein Bild geladen wird.
Blaise
6
Warum hat dies so viele Stimmen, wenn es a) seine Frage nicht beantwortet und b) außerdem eine schlechte Lösung gibt? (Meanshile die richtige Antwort ist @ Johnpolacek und hat 1 Stimme)
Yarin
5
WARNUNG!!!!!!!!!!!!!!! Dies ist nicht die richtige Antwort. Johnpolacek hat die richtige Antwort. Bitte stimmen Sie seine Antwort ab.
mrbinky3000
4
Diese Einwände scheinen nicht mehr relevant zu sein, außer unter ganz bestimmten Umständen: Webkit, wenn Sie den Quellcode eines Bildes in genau denselben Quellcode wie zuvor ändern. Für Bilder, die Sie gerade zum DOM hinzugefügt haben, sollte $ (...). Load () ausreichen. Getestet in aktuellen FF und Chrome und IE6-9: jsfiddle.net/b9chris/tXVCe/2
Chris Moschini
1
+1 Funktioniert einwandfrei, wenn sich das Bild (Sie wissen das) nicht im Browser-Cache befindet.
Lode
28

Sie können mein Plugin waitForImages verwenden , um dies zu handhaben ...

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

Dies hat den Vorteil, dass Sie es in einem Vorfahrenelement lokalisieren und optional Bilder erkennen können, auf die im CSS verwiesen wird.

Dies ist jedoch nur die Spitze des Eisbergs. Weitere Funktionen finden Sie in der Dokumentation .

Alex
quelle
Hallo Alex, sieht vielversprechend aus. Aber wie in den Antworten und Kommentaren von John Polacek und Hirisov erwähnt, deckt es den Fall ab, in dem sich das Bild bereits im Browser-Cache befindet?
SexyBeast
Ich habe einen Prozess, der ein Bild erstellt und es dynamisch lädt, nachdem die Seite bereits geladen wurde, und ich musste einen Ajax-Loader anzeigen, während der Benutzer wartet. Dieses Plugin funktioniert perfekt für diesen Anwendungsfall. Sie müssen die Funktion jedoch aufrufen, nachdem Sie die Eigenschaft img src festgelegt haben!
John Livermore
20

Die Verwendung von jQuery $ (). Load () als IMG-Ereignishandler kann nicht garantiert werden. Wenn das Bild aus dem Cache geladen wird, lösen einige Browser das Ereignis möglicherweise nicht aus. Bei (älteren?) Versionen von Safari wird das Onload-Ereignis NICHT ausgelöst , wenn Sie die SRC-Eigenschaft eines IMG-Elements auf denselben Wert geändert haben.

Es scheint, dass dies in der neuesten jQuery (1.4.x) - http://api.jquery.com/load-event - erkannt wird, um zu zitieren:

Es ist möglich, dass das Ladeereignis nicht ausgelöst wird, wenn das Bild aus dem Browser-Cache geladen wird. Um diese Möglichkeit zu berücksichtigen, können wir ein spezielles Ladeereignis verwenden, das sofort ausgelöst wird, wenn das Image bereit ist. event.special.load ist derzeit als Plugin verfügbar.

Es gibt jetzt ein Plug-In, um diesen Fall und die "vollständige" Eigenschaft des IE für Ladezustände von IMG-Elementen zu erkennen: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js

jschrab
quelle
16

Gemäß dieser Antwort können Sie das jQuery-Ladeereignis für das windowObjekt anstelle von document: verwenden.

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

Dies wird ausgelöst, nachdem der gesamte Inhalt der Seite geladen wurde. Dies unterscheidet sich davon, jQuery(document).load(...)was ausgelöst wird, nachdem das DOM vollständig geladen wurde.

Tom
quelle
Genau das habe ich gesucht!
Eric K
4

imagesLoaded Plugin ist der richtige Weg, wenn Sie eine Crossbrowser-Lösung benötigen

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

Wenn Sie nur einen IE WorkAround benötigen, reicht dies aus

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

Für Bilder gleichen Ursprungs können Sie Folgendes verwenden:

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

function imgLoaded(){
    console.log(this, 'loaded');
}
vsync
quelle
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();
           }
        });
     });
  }
Doofer
quelle
0
$( "img.photo" ).load(function() {

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

}); 
Erfan Safarpoor
quelle
0

Ich habe mein eigenes Skript erstellt, weil ich festgestellt habe, dass viele Plugins ziemlich aufgebläht sind, und ich wollte nur, dass es so funktioniert, wie ich es wollte. Meins prüft, ob jedes Bild eine Höhe hat (native Bildhöhe). Ich habe das mit der Funktion $ (window) .load () kombiniert, um die Probleme des Caching zu umgehen.

Ich habe den Code ziemlich stark kommentiert, daher sollte es interessant sein, ihn anzusehen, auch wenn Sie ihn nicht verwenden. Es funktioniert perfekt für mich.

Hier ist es ohne weiteres:

imgLoad.js Skript

3Dom
quelle
0

Warten auf das Laden aller Bilder ...
Ich habe die Antwort auf mein Problem mit jfriend00 hier gefunden. Jquery: Wie höre ich das Bild geladene Ereignis eines Container-Div? .. und "if (this.complete)"
Warten auf das Laden aller Dinge und einige möglicherweise im Cache! .. und ich habe das "Fehler" -Ereignis hinzugefügt ... es ist in allen Browsern robust

$(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/

Molokoloco
quelle