Die .load()-Funktion wird ausgelöst, wenn das Element, auf dem sie aufgerufen wird, vollständig geladen ist. Sie wird häufig bei Bildern verwendet, die möglicherweise noch nicht vollständig geladen sind, wenn das JavaScript ursprünglich ausgeführt wird, und somit falsche Informationen über sich selbst liefern würden (z. B. Höhe/Breite). Die meisten Browser handhaben dies problemlos. IE kann Probleme verursachen, wenn Bilder auf der Seite zwischengespeichert werden.
Das Bild auswählen und das src-Attribut ändern, um einen zufälligen Parameter (basierend auf dem Datum) anzuhängen. Dies wird IE dazu bringen, die .load()-Funktion ordnungsgemäß auszulösen.
myImge = $("<img />")
.attr("src",anyDynamicSource+ "?" + new Date().getTime());
Jetzt funktioniert die .load()-Funktion, auch in IE
$(myImge).load(function() {
alert("will alert even in IE")
});
Siehe den ersten Kommentar für eine Warnung bezüglich der Verwendung dieser Technik mit einem CDN.
Diese Methode kann einige CDN-Server erheblich belasten. Durch das Aufrufen des Bildes mit '[was auch immer für eine Zufälligkeit Sie wünschen]' erstellen Sie eine Kopie dieser Datei, die sich mit dieser zusätzlichen Zufälligkeit als Dateiname auf dem Server-Farm ausbreitet.
someImg.jpg -> someImg.jpg wird an das CDN weitergeleitet.
someImg.jpg?20100318000302 -> someImg.jpg?20100318000302 wird an das CDN weitergeleitet.
someImg.jpg?20100318000303 -> someImg.jpg?20100318000303 wird an das CDN weitergeleitet.
Bei kleineren Websites, die kein CDN verwenden, mag dies eine akzeptable Methode sein, aber sie ist keine praktikable Option für High-End-Websites (CNN.com, PGATOUR.com, NBA.com usw.).
Danke, welche Lösung würden Sie in einem solchen Fall vorschlagen?
Nochmals vielen Dank.
Entschuldigen Sie, Eliazer, ich habe für diesen Fall immer noch keine Lösung.
Ich habe dies nur erwähnt, um darauf hinzuweisen, da mein Team für die Anwendung dieser Methode stark kritisiert wurde, und ich anderen helfen wollte, sie nach Möglichkeit zu vermeiden.
Um das Brechen des Caching und von CDNs zu vermeiden, füge ich die MD5-Summe des Bildes als Parameter hinzu. Dies hilft auch, Browser dazu zu bringen, zwischengespeicherte CSS-Dateien zu aktualisieren. Hier ist ein Beispiel für einen zwischengespeicherten CSS-Link, der von PHP ausgegeben wird. Bildlinks sollten auf die gleiche Weise konstruiert werden.
was ausgibt
Ich hoffe, das hilft jemandem (und ich hoffe, das ist gut formatiert, ich habe noch nie 'Markdown' verwendet).
jQuery 1.4.2 erledigt das bereits für Sie (jedoch über die $.ajax()-Funktion). Setzen Sie einfach cache : false in die AJAX-Einrichtung, und es sollte für Sie funktionieren.
Das hat nichts mit AJAX-Anfragen zu tun, es geht um normale img-Tags und das Auslösen einer Funktion, wenn das Bild geladen ist (d. h. [img onload=this-function /]), und nicht um $(target).load(‘http address’, function(){});, was etwas völlig anderes ist.
jQuery hat mehrere Funktionen mit gleichem Namen, und je nach Kontext kann etwas anderes bedeuten.
wie click() bedeutet, das Click-Ereignis auszulösen, aber click(function(){ }), bedeutet, einen Click-Handler zu binden.
Siehe auch
http://api.jquery.com/load/
http://api.jquery.com/load-event/
Danke dafür. Ich denke, ich werde in meinem Fall einen etwas anderen Ansatz wählen. Das Problem bei dieser Methode ist, dass Sie alle Vorteile des Bild-Cache in allen anderen Browsern verlieren, und ich möchte nicht die Erfahrung aller anderen beeinträchtigen, nur wegen IE7.
Stattdessen werde ich die .load-Funktion dort belassen, aber auch eine setTimeout-Funktion haben, die dasselbe tut wie load (da es in meinem Fall nur das Entfernen einer Klasse ist, ist das kein Problem). Ich bin sicher, es gibt eine bessere Methode. Irgendjemand?
Oh, ich habe die Antwort hier gefunden
http://www.witheringtree.com/2009/05/image-load-event-binding-with-ie-using-jquery/
siehe comment-4731
Ausgezeichneter Fund, Ben!!!
Das ist eine viel bessere Lösung. Chris sollte das zu seinem Blog-Beitrag hinzufügen!!!
Es bricht nicht das Caching und funktioniert auch in älteren IE-Versionen.
Wie John Jimenez erwähnt hat, wird die gegebene Methode die CDN-Trefferquote erhöhen. Es gibt eine einfachere Methode, dies zu erreichen, hier ist Pseudocode
Danke. Jetzt funktioniert es in allen Browsern hervorragend.
var url = any dynamic url;
var img = new Image();
$(“<img/>”) // In-Memory-Kopie des Bildes erstellen, um CSS-Probleme zu vermeiden
.attr(“src”, url+ “?” + new Date().getTime())
.load(function() {
// Irgendwelche Aktionen durchführen
});
Hallo Bhanu Partap, ich brauche deine Hilfe, ich leide unter demselben Problem, kann es aber nicht klar verstehen.
Ich habe dasselbe Problem, bin mir aber nicht sicher, wo ich mit der Behebung beginnen soll. Könnte mir bitte jemand zwei Minuten Zeit nehmen und sich dieses Problem kurz ansehen?
URL: http://www.media21a.co.uk/development/unknown/
Jede/Alle Hilfe wird gewürdigt, danke.
Hier ist eine Ein-Zeilen-Lösung, die Sie anstelle von $(‘img’).load(function(){ //// }); verwenden können.
Ich hatte mit diesem Problem auf einer der von mir erstellten Websites zu kämpfen, und tatsächlich gibt es einen etwas besseren Weg, dies zu beheben. Es stellt sich heraus, dass der Fehler behoben ist, wenn Sie zuerst "load" hinzufügen und erst danach "src" für das Bild ändern.
Der beste Weg wäre also eigentlich:
Es hat bei mir bei mehreren Durchläufen für dieselben bereits zwischengespeicherten Bilder einwandfrei funktioniert.
Einen schönen Tag noch
Hey Rytis, danke! Das funktioniert jetzt perfekt in IE9, IE8, IE7, Chrome, Mozilla und Safari. :)
Oh Mann. Es ist lange her, seit diese Antwort gegeben wurde, aber sie hat mir immer noch das Leben gerettet!
Danke!
Können Sie mir bitte sagen, wie das in reinem JavaScript geht? Ich habe versucht, die src innerhalb der onload-Funktion zu ändern, das hat immer wieder die Source-URL aufgerufen und das Bild aktualisiert, was sinnvoll ist. Wie kann ich es mit Ihrer Lösung einmal ausführen lassen? Ich habe versucht, eine leere load-Funktion für img hinzuzufügen und dann src zu ändern, das hilft nicht.
Danke
Danke Rytis! Sehr einfach, aber sehr effektiv. Macht irgendwie Sinn ;)
Danke Jesus für die Existenz dieser Seite. Und Props auch an Rytis und Chris.
Je nachdem, was Sie tun, tut dies auch den Trick
$('').load(function() { // }).load();Also ja, in anderen Browsern wird Ihre Funktion möglicherweise zweimal aufgerufen, aber es sollte nicht zu schwer sein, dies zu überprüfen.
Rytis: Du bist mein Held, Mann!
IE7 bereitete mir Schwierigkeiten damit und ich bevorzugte nicht die Methode, einen Zeitstempel anzuhängen, wegen der zuvor erwähnten Probleme.
Danke!
Ich bin froh, dass ich helfen konnte :) es hat mir auch meine eigene geistige Gesundheit gerettet :D
Respekt an Rytis dafür … das hat bei mir funktioniert
Rytis: Danke, dass Sie meinen Tag und die wenigen Haare gerettet haben, die mir von all der Frustration übrig geblieben sind.
Das ist nicht nur IE-spezifisch. Auch Chrome und mein Android-Handy verhalten sich genauso. Ich setze ein data-Feld auf true, sobald das Bild geladen ist und das Load-Ereignis ausgelöst wird. Nachdem das gesamte Fenster geladen ist, prüfe ich alle Elemente, für die das data-Feld nicht auf true gesetzt wurde, und führe meine Funktion für diese aus. So wird die Funktion nie zweimal pro Bild aufgerufen und sie wird immer ausgelöst, egal ob die Bilder zwischengespeichert sind oder nicht.
Vielen Dank! Es funktioniert großartig!
Vielen Dank. Nützlich wie immer.
Rytis, du bist der Mann!! Danke.
Oooo!! Gibt es etwas, das du nicht weißt?
Ich bevorzuge die Lösung von Chris, da sie besser zu meinem Code passt.
Warum packst du es zweimal in jQuery?
Also ist es äquivalent zu
$($("<img />"))Vielen Dank, Nme. Die Überprüfung der Höhe anstelle der Verwendung von load war der richtige Weg, um das Problem mit älteren IE-Versionen zu lösen, die die load-Funktion nicht ein zweites Mal auslösen.
Sie haben mir gerade den Tag gerettet.
Danke Rytis.
Nur eine Anmerkung zu einigen Antworten.
$("#element").load(function() { });wurde ab jQuery 1.8 als veraltet eingestuft und sollte durch Folgendes ersetzt werden.Danke für den Beitrag. Ich hatte genau dasselbe Problem. Ich habe es auf direkte Weise mit Ihrem Code behoben.
Ich weiß, dass Browser-Sniffing als schlechte Praxis gilt, aber bei etwas wie diesem, wo die Überprüfung der Unterstützung nicht das ist, was Sie brauchen, denke ich, dass es gerechtfertigt wäre. Wie ein Kommentator zuvor sagte, warum die Caching-Vorteile anderer Leute opfern und deren Erfahrung verlangsamen, nur für die anderen Benutzer, die sich für den verpönten IE-Weg entschieden haben. Sie könnten einfach prüfen, ob der Browser IE ist und diese Methode anwenden, wenn Sie kein CDN verwenden.
Ich glaube, ich habe eine bessere Lösung gefunden, die a) funktioniert, egal wann Sie den onload-Handler anhängen – vor oder nach dem Setzen von src – und b) keine Kopien Ihrer Bilder auf dem Server erstellt.
Es stellt sich heraus, dass Sie dem Bild keinen zufälligen Query-Parameter hinzufügen müssen. Machen Sie einfach Folgendes:
Wie Sie sehen, wird das src-Attribut auf denselben Wert gesetzt wie zuvor. Auf diese Weise lädt IE das Bild nicht einmal neu, es löst nur das onload-Ereignis aus, was genau das ist, was wir wollen. :-)
Hier ist eine bessere Lösung mit jQuery.
$("img").one('load', function() {
// Ihr Code hier
}).each(function() {
if(this.complete) {
$(this).load();
}
});
Danke. Für mehr Lösungen schauen Sie unter
http://fiverr.com/dosporto/fix-your-javascript-jquery-jquery-mobile-issues
Gibt es einen Vorteil bei der Verwendung eines '#'-Zeichens anstelle eines '?' in der Abfragezeichenfolge? Ich habe Fälle gesehen, in denen ein '#' immer noch das zwischengespeicherte Bild verwendet und nicht ein Cache-brechendes '?' – wie unter http://www.post-hipster.com/2008/10/20/using-javascript-to-refresh-an-image-without-a-cache-busting-parameter/
Das scheint ein valider Punkt zu sein. Ich kann den verlinkten Artikel nicht lesen, da ich bei der Arbeit bin, aber ich stelle mir vor, dass das '#'-Zeichen weniger störend wäre als ein '?' als Parameter.
Lösung: https://gist.github.com/paulirish/268257
Hallo, ich muss ein Hintergrundbild für einen Div laden.
Wenn ich auf niedrig klicke, muss ich hoch mit Hintergrundbild anzeigen. In Chrome usw. habe ich eine Lösung, aber in IE flackert der Hintergrund des Divs nach dem Klick.
Vielen Dank für Ihren Tipp.
Es scheint, dass Firefox 33 auch unzuverlässig ist, wenn es um Load-Ereignisse für zwischengespeicherte Bilder geht. : (
Nun, tatsächlich gibt es Wege, zwischengespeicherte Bilder korrekt zu behandeln. Ich habe Tutorials dazu geschrieben
Bilder mit jQuery laden und Ereignisse zur Anzeige von Ladesymbolen verarbeiten
Und wenn Sie natives JavaScript ohne jQuery verwenden möchten, können Sie mein anderes Tutorial ansehen
Bilder mit nativem JavaScript laden und Ereignisse zur Anzeige von Ladesymbolen verarbeiten
Ich kann dieses Problem leicht beheben.
Broxer