Prüfen Sie, ob ein Bild geladen wurde (keine Fehler) mit jQuery
Bin ich mit JavaScript mit dem jQuery-Bibliothek zur Bearbeitung von Bild-thumbnails, die in einer ungeordneten Liste. Wenn das Bild geladen ist, tut eine Sache, wenn ein Fehler Auftritt es tut etwas anderes. Ich bin mit jQuery load()
und error()
Methoden als Ereignisse. Nach diesen Ereignissen, die ich überprüfen Sie das Bild DOM-element für die .abgeschlossen, um sicherzustellen, dass das Bild nicht schon geladen wird, bevor jQuery konnten sich die Ereignisse.
Es funktioniert einwandfrei, außer wenn ein Fehler Auftritt, bevor jQuery können registrieren der Ereignisse. Die einzige Lösung, die ich denken kann, ist die Verwendung des img - onerror
Attribut zum speichern einer "Flagge" irgendwo Global (bzw. auf den Knoten, den es selbst), dass sagt, dass es nicht so jQuery können überprüfen, dass den "store/Knoten" bei der Prüfung .abgeschlossen.
Jemand eine bessere Lösung?
Edit: Fett wichtigsten Punkte und mehr Details unter:
Ich bin die Kontrolle, wenn ein Bild abgeschlossen ist (auch geladen), NACHDEM ich einen laden und error-Ereignis auf dem Bild. So, wenn das Bild geladen wurde, bevor die Ereignisse registriert wurden, will ich noch wissen. Wenn das Bild nicht geladen nach den Ereignissen dann die Ereignisse wird sich darum kümmern, wenn es funktioniert. Das problem mit diesem ist, kann ich leicht überprüfen, ob ein Bild geladen wird, schon, aber ich kann nicht sagen, ob ein Fehler aufgetreten statt.
- Wenn Sie sich registrieren, die jQuery-events? Vielleicht einige codes helfen. 🙂
- Es gibt eine Menge code, was ich oben sagte ist nur eine sehr einfache version von dem, was ich Tue. Ich nenne die Ereignisse, nachdem das DOM geladen ist, eine Methode aufgerufen wird, um Ereignisse hinzufügen der thumbnails.
- möglich, Duplikat der Wie kann ich feststellen, ob ein Bild geladen wurde, mit Javascript/jQuery?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine weitere option ist das auslösen der
onload
- und/oderonerror
Veranstaltungen durch die Schaffung einer in-memory-image-element und die Einstellung seinersrc
Attribut der originalsrc
Attribut des ursprünglichen Bildes. Hier ist ein Beispiel was ich meine:Hoffe, das hilft!
.attr
Zeile nachdem die.load
und.error
Linien. Sonst riskieren Sie, dass das Bild laden (oder einen Fehler), bevor diese callbacks Hinzugefügt werden, und Sie werden nicht genannt..load()
und.error()
Methoden sind verwirrend, und als deprecated gekennzeichnet, verwenden.on()
und verwenden Sie dieload
underror
als Ereignisse.complete
undnaturalWidth
, sonst bist du nur mit extra Bandbreite für etwas, das Sie nicht brauchen, umIsImageOk
ist, dass, wenn false zurückgegeben wird, es ist unklar, ob ein Fehler aufgetreten ist oder wenn das Bild einfach noch nicht fertig geladen ist. Du bist also erzwungen werden, zu erstellen, die eine busy-loop aufrufenIsImageOk
immer und immer wieder. Wie für die Bandbreite, die beim erstellen der in-memory-version des Bildes, es ist sehr wahrscheinlich, dass die Bild-Daten werden gezogen aus dem browser-cache. In meiner Erfahrung, nur ältere IE-Versionen ein weiteres Problem-GET-Anfrage.Überprüfen Sie die
complete
undnaturalWidth
Eigenschaften, in dieser Reihenfolge.https://stereochro.me/ideas/detecting-broken-images-js
img.naturalWidth === 0
, keine Notwendigkeit, um zu testen, dass der Typ nichtundefined
.naturalWidth
&naturalHeight
sind "nur" IE9+ kompatibel ist, finden Sie in diesem für cross-browser-Unterstützung stackoverflow.com/a/7869044/759452. Zweite Sache, die zu beachten sind: Ihre Antwort ist ähnlich wie diese Antwort stackoverflow.com/a/3016076/759452 inspiriert von diesem Artikel von StereoChrome geschrieben in 2005 stereochro.mir/Ideen/erkennen-gebrochen-Bilder-js.load()
handler. Vielleicht so etwas wie dies funktionieren würde? jsbin.com/qahuqatiyomo/4/edit?js,console,outputBasiert auf meinem Verständnis von der W3C-HTML-Spezifikation für das
img
- element, Sie sollten in der Lage sein, dies zu tun mit einer Kombination descomplete
undnaturalHeight
Attribute, etwa so:Aus der Spezifikation für die
complete
Attribut:Also im wesentlichen
complete
gibt true zurück, wenn das Bild entweder vollständig geladen oder nicht geladen werden konnte. Da wollen wir nur den Fall, wo das Bild erfolgreich geladen wurde, müssen wir überprüfen Sie dienauturalHeight
Attribut als auch:Und
verfügbar
ist definiert wie folgt:Also, wenn das Bild "broken" (Fehler beim laden), dann wird es in den kaputten Staat, nicht die zur Verfügung Stand, so
naturalHeight
0.Daher, die überprüfung
imgElement.complete && imgElement.naturalHeight !== 0
sollte uns sagen, ob das Bild erfolgreich geladen wurde.Lesen Sie mehr dazu in der W3C-HTML-Spezifikation für das
img
- element, oder auf MDN.Habe ich versucht viele verschiedene Wege, und dieser Weg ist der einzige, der für mich gearbeitet
Könnte man auch hinzufügen einer callback-Funktion ausgelöst, sobald alle Bilder geladen sind, in die DOM-und fertig. Dies gilt für dynamisch hinzugefügte Bilder auch. http://jsfiddle.net/kalmarsh80/nrAPk/
Verwenden
imagesLoaded
javascript-Bibliothek.Verwendbar mit plain Javascript und als jQuery-plugin.
Features:
Ressourcen
complete
Eigenschaft scheint nicht klar unterstützt werden: nicht in der Lage zu finden eine zuverlässige Quelle von Informationen über browser-Unterstützung.complete
Eigenschaft scheint auch nicht klar-Spezifikation: die HTML5-Spezifikation ist die einzige, die es zu erwähnen & es ist immer noch in einer draft-version zur Zeit schreiben. Wenn SienaturalWidth
&naturalHeight
nur IE9+ unterstützt, so dass, wenn Sie es verwenden, um herauszufinden, ob das Bild geladen ist, müssen Sie einige "schlaue" trick, damit es funktioniert auf alten Browsern, & Sie müssen prüfen, cross-browser-Verhalten ist konsistentnaturalWidth
&naturalHeight
browser-Unterstützung stackoverflow.com/questions/6900177/...Abrufen von Informationen aus Bild-Elemente auf der Seite
Test arbeiten auf Chrome und Firefox
Arbeiten jsFiddle (öffnen Sie Ihre Konsole, um das Ergebnis zu sehen)
Hinweis : ich habe jQuery, dachte ich, das kann acheive auf volle javascript
Finde ich gute Informationen hier OpenClassRoom --> dies ist ein Französisch-forum
Echtzeit-Netzwerk-Detektor - check network status, ohne die Seite aktualisieren:
(es ist nicht von jquery, ist aber getestet und 100% funktioniert:(getestet auf Firefox Version 25.0))
Code:
wenn die Verbindung verloren, nur drücken Sie die Schaltfläche Erneut.
Update 1:
Auto detect, ohne die Seite aktualisieren:
Dies ist, wie ich es habe zu arbeiten, cross-browser-Verwendung einer Kombination der oben genannten Methoden (ich musste auch die Bilder einfügen, die dynamisch in das dom):
Hinweis: geben Sie eine gültige Boolesche Staat für die isIE variable.
Nach dem Lesen der interessanten Lösungen auf dieser Seite, ich habe eine easy-to-use-Lösung stark beeinflusst von SLaks' und Noyo ' s Beitrag, scheint zu funktionieren auf ziemlich aktuellen Versionen (wie Sie schreiben) von Chrome, IE, Firefox, Safari, Opera und Chrome (alle unter Windows). Auch, es funktionierte auf einem iPhone/iPad-emulator die ich verwendet habe.
Einen großen Unterschied zwischen dieser Lösung und SLaks und Noyo ' s post ist, dass diese Lösung vor allem überprüft die naturalWidth und naturalHeight Eigenschaften. Ich habe festgestellt, dass in den aktuellen browser-Versionen, diese beiden Eigenschaften scheinen die meisten hilfreich und konsistente Ergebnisse.
Dieser code gibt TRUE zurück, wenn ein Bild geladen wurde, voll UND erfolgreich. Es gibt FALSE zurück, wenn entweder ein Bild hat nicht geladen noch voll ODER Fehler beim laden.
Eine Sache, die Sie müssen sich bewusst sein, dass diese Funktion auch FALSE zurückgeben, wenn das Bild ist ein 0x0 pixel großes Bild. Aber die Bilder sind ziemlich ungewöhnlich, und ich kann nicht glauben, eine sehr nützliche Fall, wo Sie möchten, um zu überprüfen, um zu sehen, ob ein 0x0 pixel großes Bild geladen wurde, noch nicht 🙂
Zuerst legen wir eine neue Funktion namens "isLoaded" der HTMLImageElement Prototyp, so dass die Funktion auf jedem Bild-element.
Dann, jedes mal, wenn wir brauchen, um zu überprüfen, die den lade-status des Bildes, wir rufen die "isLoaded" - Funktion.
Pro giorgian Kommentar SLaks' und Noyo Beitrag, diese Lösung kann wahrscheinlich nur als one-time-überprüfen Sie auf einer Safari Mobile, wenn Sie planen, ändern Sie das SRC-Attribut. Aber Sie können das umgehen, indem erstellen eines Bild-Elements mit einem neuen SRC-Attribut anstelle der änderung des SRC-Attribut auf eine vorhandene image-element.
//Oder Als Plugin
So wie ich das verstehe die .complete-Eigenschaft ist nicht-standard. Es kann nicht universell sein... ich merke, es scheint zu funktionieren, anders in Firefox Verse, DH. Ich bin laden eine Reihe von Bildern, die in javascript dann die Kontrolle, wenn abgeschlossen. Im Firefox scheint das gut zu funktionieren. Im IE ist es nicht, weil die Bilder angezeigt werden, geladen zu werden, in einem anderen thread. Es funktioniert nur wenn ich eine Verzögerung zwischen meiner Zuordnung zum Bild.src und wenn ich das Bild.complete-Eigenschaft.
Mit Bild.onload und Bild.onerror nicht für mich arbeiten, entweder, weil ich muss ein parameter übergeben werden, um zu wissen, mit welchem Bild ich spreche, wenn die Funktion aufgerufen wird. Jede Weise, das zu tun, scheint zu scheitern, weil es eigentlich zu gehen scheint, die gleiche Funktion, nicht verschiedene Instanzen der gleichen Funktion. Also der Wert, den ich übergeben, um zu identifizieren, die das Bild immer endet als der Letzte Wert in der Schleife. Ich kann mir nicht vorstellen, dass es eine Möglichkeit, um dieses problem.
Auf Safari und Chrome, sehe ich das Bild.Vollständigkeit, Wahrheit und die naturalWidth gesetzt, selbst wenn der Fehler-Konsole zeigt eine 404 für das Bild... und ich absichtlich entfernt, das Bild zu testen. Aber das oben funktioniert gut für Firefox und IE.
Diesem code-snippet hat mir geholfen, zu beheben, browser-caching Probleme:
Wenn der browser-cache deaktiviert ist, ist nur dieser code funktioniert nicht:
damit es funktioniert, müssen Sie hinzufügen:
Verwendung dieser
JavaScript
code können Sie überprüfen Bild erfolgreich geladen wurde oder nicht.Versuchen, diese
Ich hatte viele Probleme mit der kompletten Last von einem Bild und die EventListener.
Was immer ich probierte, die Ergebnisse nicht zuverlässig.
Aber dann fand ich die Lösung. Es ist technisch nicht ein nettes, aber jetzt hatte ich nie eine fehlgeschlagene Bild laden.
Was ich getan habe:
Stattdessen laden Sie das Bild einer Zeit, die ich nur laden Sie es ein zweites mal direkt nach dem ersten mal und beide laufen durch den Event-Handler.
Alle meine Kopfschmerzen sind Weg!
Übrigens:
Sie Jungs von stackoverflow hat mir geholfen, schon mehr als hundert mal. Für diese ein sehr großes Danke!!!
Das war gut für mich 🙂