Eingabe eines Standardbildes für den Fall, dass das src-Attribut eines HTML <img> ungültig ist?
268
Gibt es eine Möglichkeit, ein Standardbild in einem HTML- <img>Tag zu rendern , falls das srcAttribut ungültig ist (nur HTML verwendet)? Wenn nicht, wie würden Sie es leicht umgehen?
HTML hat keinen Fallback für fehlerhafte Bilder. Sie müssten JavaScript verwenden, um fehlerhafte Bilder zu finden und deren src-Attribut zu ändern.
Blixt
2
@Blixt - Was ist, wenn Ihr Client MS Outlook oder ein anderer EMAIL-Reader ist und Sie kein Javascript haben und die Objektoption nicht funktioniert ... Ich
nehme an
Antworten:
319
Sie haben nach einer reinen HTML- Lösung gefragt ...
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"><htmllang="en"><head><title>Object Test</title><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"></head><body><p><objectdata="http://stackoverflow.com/does-not-exist.png"type="image/png"><imgsrc="https://cdn.sstatic.net/Img/unified/sprites.svg?v=e5e58ae7df45"alt="Stack Overflow logo and icons and such"></object></p></body></html>
Da das erste Bild nicht vorhanden ist, wird der Fallback (die auf dieser Website * verwendeten Sprites) angezeigt. Und wenn Sie einen wirklich alten Browser verwenden, der dies nicht unterstützt object, wird dieses Tag ignoriert und das imgTag verwendet. Siehe caniuse Website für Kompatibilität. Dieses Element wird von allen Browsern ab IE6 + weitgehend unterstützt.
* Sofern sich die URL für das Bild nicht (erneut) geändert hat, wird in diesem Fall wahrscheinlich der Alternativtext angezeigt.
Es funktionierte für mich in IE8, nachdem ich die DTD für HTML 4.01 eingegeben hatte.
Patrick McElhaney
Dies funktioniert nicht, wenn das nicht vorhandene Bild X-Frame-Optionsauf SAMEORIGINoder eine zulässigere Einstellung eingestellt wurde.
Attila O.
Es funktioniert, aber wenn der Link in object.data nicht vertrauenswürdig ist, kann er alle
möglichen Dinge
1
Das Element 'img' kann nicht im Element 'object' verschachtelt werden.
Matheus Miranda
2
@ Matheus Sicher kann es. In HTML4 kann das Objekt Flow-Inhalte enthalten (fast alles, einschließlich img), und in HTML5 ist es transparent, was bedeutet, dass es jedes gültige HTML5 enthalten kann.
Patrick McElhaney
318
Das funktioniert gut für mich. Vielleicht möchten Sie JQuery verwenden, um das Ereignis zu verknüpfen.
Aktualisiert: Nur CSS-Lösung
Ich habe kürzlich die Vitaly Friedman- Demo als großartige CSS-Lösung gesehen, die mir nicht bekannt war. Die Idee ist, die contentEigenschaft auf das fehlerhafte Bild anzuwenden . Normalerweise :afteroder :beforenicht auf Bilder anwendbar, aber wenn sie kaputt sind, werden sie angewendet.
Wie die Geige zeigt, wird das kaputte Bild selbst nicht entfernt, aber dies wird wahrscheinlich das Problem in den meisten Fällen ohne JS oder CSS lösen. Wenn Sie verschiedene Bilder an verschiedenen Orten anwenden müssen, unterscheiden Sie einfach mit einer Klasse:.my-special-case img:before { ...
Meiner Meinung nach. Dies ist die bessere Antwort. Hier nehmen Mackenmodi einen Fehler an ..... scheint mir ziemlich sicher zu sein. quirksmode.org/dom/events/error.html#t01
n0nag0n
12
Übrigens, wenn error.jpg nicht existiert, verursacht dies eine Endlosschleife, weil es immer wieder versucht, das Bild zu finden, dann wird onError erneut aufgerufen, es kann es nicht finden und das Ganze beginnt von vorne.
Borq
30
Um das Risiko einer Endlosschleife zu vermeiden, fügen Sie einfach einen Test hinzu: <img src = "foo.jpg" onerror = "if (this.src! = 'Error.jog') this.src = 'error.jpg';">
jacquarg
21
Alternativ können Sie schreiben:onerror="this.src='error.jpg';this.onerror='';"
Das funktioniert super. Hier ist ein Update mit einem Fallback-Image auf imgur: <img src = "a-missing-image.jpg" alt = "" onerror = "this.src = 'http: ///i.imgur.com/hfM1J8s.png' ">
Verwenden Sie ein Hintergrundbild, mit dem Sie mehrere Bilder hinzufügen können. Mein Fall: image1 ist das Hauptbild, dies wird von einem Ort (Browser, der eine Anfrage ausführt) abgerufen. Image2 ist ein lokales Standardbild, das angezeigt wird, während image1 geladen wird. Wenn image1 einen Fehler zurückgibt, wird dem Benutzer keine Änderung angezeigt, und dies ist für die Benutzererfahrung sauber
Zeigen die meisten Browser kein Bild mit "defektem Link" an, wenn das Bild nicht gefunden wird ... In diesem Fall würde das Problem durch Einstellen des Hintergrunds nicht gelöst.
Justin D.
13
Ich denke nicht, dass es möglich ist, nur HTML zu verwenden. Mit Javascript sollte dies jedoch machbar sein. Bassisch durchlaufen wir jedes Bild, testen, ob es vollständig ist und ob es natürlich ist. Breite ist Null, bedeutet dies, dass es nicht gefunden wurde. Hier ist der Code:
fixBrokenImages =function( url ){var img = document.getElementsByTagName('img');var i=0, l=img.length;for(;i<l;i++){var t = img[i];if(t.naturalWidth ===0){//this image is broken
t.src = url;}}}
Angenommen, diese itemhat eine Eigenschaft url, die möglicherweise null ist. Wenn dies der Fall ist, wird das Bild als fehlerhaft angezeigt. Dies löst die Ausführung des onerrorAttributausdrucks aus, wie oben beschrieben. Sie müssen das überschreibensrc Attribut wie oben beschrieben , benötigen jedoch jQuery, um auf Ihr altSrc zuzugreifen. Es konnte nicht mit Vanille-JavaScript funktionieren.
Könnte ein wenig hacky wirken, hat aber den Tag in meinem Projekt gerettet.
ein einfaches img-element ist nicht sehr flexibel, deshalb habe ich es mit einem bildelement kombiniert. Auf diese Weise wird kein CSS benötigt. Wenn ein Fehler auftritt, werden alle srcset auf die Fallback-Version gesetzt. Ein defektes Linkbild wird nicht angezeigt. Es werden keine nicht benötigten Bildversionen geladen. Das Bildelement unterstützt Responsive Design und mehrere Fallbacks für Typen, die vom Browser nicht unterstützt werden.
Dieser ist großartig! Beachten Sie die fehlende Browserunterstützung caniuse.com/#feat=picture . Erwägen Sie die Verwendung einer Polyfüllung oder einer anderen Lösung, wenn Sie ältere Browser wie IE11 unterstützen müssen.
Obwohl dies funktionieren mag, glaube ich nicht, dass es neue Informationen hinzufügt. Der Fehlerteil ist nur Vanille-JavaScript und die src-Bindung sollte Angular-Benutzern bereits bekannt sein
Chic
7
Einfache und übersichtliche Lösung mit einigen guten Antworten und Kommentaren.
@ Script47 Es ist ordentlich, ich wiederhole ordentlich
manish kumar
1
Nein, ich würde auch nicht sagen, dass es ordentlich ist. Ganz zu schweigen davon, dass dies wahrscheinlich eine Wiederholung anderer Lösungen ist.
Script47
Klappt wunderbar! Danke dir!
Goehybrid
1
Lebensretter. Ich wollte nicht elegant, ich wollte einfach und arbeitend. Vielen Dank!
Kit
7
Ein HTML einzige Lösung, wo die einzige Voraussetzung ist , dass Sie wissen , die Größe des Bildes , das Sie Einfügen. Funktioniert nicht für transparente Bilder, da es background-imageals Füllmaterial verwendet wird.
Wir können background-imagedas Bild, das angezeigt wird, wenn das angegebene Bild fehlt, erfolgreich verknüpfen. Dann ist das einzige Problem das kaputte Symbolbild - wir können es entfernen, indem wir ein sehr großes leeres Zeichen einfügen und so den Inhalt außerhalb der Anzeige von verschieben img.
Es gibt keine Möglichkeit, sicher zu sein, wie viele Clients (Browser) versuchen, Ihre Seite anzuzeigen. Ein zu berücksichtigender Aspekt ist, dass E-Mail-Clients defakte Webbrowser sind und möglicherweise nicht mit solchen Tricks umgehen ...
Als solches sollten Sie AUCH einen Alt / Text mit einer STANDARDBREITE und -HÖHE wie diesen einfügen. Dies ist eine reine HTML-Lösung.
alt="NO IMAGE" width="800" height="350"
Die andere gute Antwort würde also wie folgt leicht modifiziert:
Die obige Lösung ist unvollständig , sie hat das Attribut verfehlt src.
this.srcund this.attribute('src')sind NICHT gleich, der erste enthält zum Beispiel den vollständigen Verweis auf das Bild http://my.host/error.jpg, aber das Attribut behält nur den ursprünglichen Wert bei.error.jpg
Wenn ich diesen Code verwende, sehe ich Uncaught TypeError: this.attribute is not a functionin Chrome 43.
John Washam
Verwenden Sie jQuery?
mix3d
onError ist gemäß developer.mozilla.org/en-US/docs/Web/HTML/Element/img
comiventor
2
Wenn Sie Angular 1.x verwenden, können Sie eine Direktive einfügen, mit der Sie auf eine beliebige Anzahl von Bildern zurückgreifen können. Das Fallback-Attribut unterstützt eine einzelne URL, mehrere URLs innerhalb eines Arrays oder einen Winkelausdruck unter Verwendung von Bereichsdaten:
Fügen Sie Ihrem Winkel-App-Modul eine neue Fallback-Direktive hinzu:
angular.module('app.services',[]).directive('fallback',['$parse',function($parse){return{restrict:'A',
link:function(scope, element, attrs){var errorCount =0;// Hook the image element error event
angular.element(element).bind('error',function(err){var expressionFunc = $parse(attrs.fallback),
expressionResult,
imageUrl;
expressionResult = expressionFunc(scope);if(typeof expressionResult ==='string'){// The expression result is a string, use it as a url
imageUrl = expressionResult;}elseif(typeof expressionResult ==='object'&& expressionResult instanceofArray){// The expression result is an array, grab an item from the array// and use that as the image url
imageUrl = expressionResult[errorCount];}// Increment the error count so we can keep track// of how many images we have tried
errorCount++;
angular.element(element).attr('src', imageUrl);});}};}])
Tolle Idee! Ein Array aus Fallback-Bildern ist eine gute Implementierung
Z. Khullah
1
Ich musste kürzlich ein Fallback-System bauen, das eine beliebige Anzahl von Fallback-Bildern enthielt. So habe ich es mit einer einfachen JavaScript-Funktion gemacht.
Google hat diese Seite mit den Schlüsselwörtern "image fallback html" verworfen. Da mir jedoch keines der oben genannten Elemente geholfen hat und ich nach einer "SVG-Fallback-Unterstützung für IE unter 9" gesucht habe, habe ich weiter gesucht und Folgendes gefunden:
Zusätzlich zu Patricks brillanter Antwort für diejenigen unter Ihnen, die nach einer plattformübergreifenden eckigen js-Lösung suchen, können Sie Folgendes tun:
<objecttype="image/png"data-ng-attr-data="{{ url || 'data:' }}"><!-- any html as a fallback --></object>
Wenn Sie ein dynamisches Webprojekt erstellt und das erforderliche Bild in WebContent platziert haben, können Sie mit dem folgenden Code in Spring MVC auf das Bild zugreifen:
Sie können auch einen Ordner mit dem Namen img erstellen und das Bild im Ordner img ablegen und diesen img-Ordner in WebContent ablegen. Anschließend können Sie mit dem folgenden Code auf das Bild zugreifen:
image.setAttribute('src','../icons/<some_image>.png');//check the height attribute.. if image is available then by default it will //be 100 else 0if(image.height ==0){
image.setAttribute('src','../icons/default.png');}
Antworten:
Sie haben nach einer reinen HTML- Lösung gefragt ...
Da das erste Bild nicht vorhanden ist, wird der Fallback (die auf dieser Website * verwendeten Sprites) angezeigt. Und wenn Sie einen wirklich alten Browser verwenden, der dies nicht unterstützt
object
, wird dieses Tag ignoriert und dasimg
Tag verwendet. Siehe caniuse Website für Kompatibilität. Dieses Element wird von allen Browsern ab IE6 + weitgehend unterstützt.* Sofern sich die URL für das Bild nicht (erneut) geändert hat, wird in diesem Fall wahrscheinlich der Alternativtext angezeigt.
quelle
X-Frame-Options
aufSAMEORIGIN
oder eine zulässigere Einstellung eingestellt wurde.Das funktioniert gut für mich. Vielleicht möchten Sie JQuery verwenden, um das Ereignis zu verknüpfen.
Aktualisiert mit Jacquargs Error Guard
Aktualisiert: Nur CSS-Lösung Ich habe kürzlich die Vitaly Friedman- Demo als großartige CSS-Lösung gesehen, die mir nicht bekannt war. Die Idee ist, die
content
Eigenschaft auf das fehlerhafte Bild anzuwenden . Normalerweise:after
oder:before
nicht auf Bilder anwendbar, aber wenn sie kaputt sind, werden sie angewendet.Demo: https://jsfiddle.net/uz2gmh2k/2/
Wie die Geige zeigt, wird das kaputte Bild selbst nicht entfernt, aber dies wird wahrscheinlich das Problem in den meisten Fällen ohne JS oder CSS lösen. Wenn Sie verschiedene Bilder an verschiedenen Orten anwenden müssen, unterscheiden Sie einfach mit einer Klasse:
.my-special-case img:before { ...
quelle
onerror="this.src='error.jpg';this.onerror='';"
Fand diese Lösung in Spring in Action 3rd Ed.
<img src="../resources/images/Image1.jpg" onerror="this.src='../resources/images/none.jpg'" />
Update: Dies ist keine reine HTML-Lösung ...
onerror
ist Javascriptquelle
Verwenden Sie ein Hintergrundbild, mit dem Sie mehrere Bilder hinzufügen können. Mein Fall: image1 ist das Hauptbild, dies wird von einem Ort (Browser, der eine Anfrage ausführt) abgerufen. Image2 ist ein lokales Standardbild, das angezeigt wird, während image1 geladen wird. Wenn image1 einen Fehler zurückgibt, wird dem Benutzer keine Änderung angezeigt, und dies ist für die Benutzererfahrung sauber
quelle
Stellen Sie sicher, dass Sie die Bildabmessungen eingeben und angeben, ob das Bild gekachelt werden soll oder nicht.
quelle
Ich denke nicht, dass es möglich ist, nur HTML zu verwenden. Mit Javascript sollte dies jedoch machbar sein. Bassisch durchlaufen wir jedes Bild, testen, ob es vollständig ist und ob es natürlich ist. Breite ist Null, bedeutet dies, dass es nicht gefunden wurde. Hier ist der Code:
Verwenden Sie es so:
Getestet in Chrome und Firefox
quelle
Wenn Sie Angular / jQuery verwenden, kann dies hilfreich sein ...
Erläuterung
Angenommen, diese
item
hat eine Eigenschafturl
, die möglicherweise null ist. Wenn dies der Fall ist, wird das Bild als fehlerhaft angezeigt. Dies löst die Ausführung desonerror
Attributausdrucks aus, wie oben beschrieben. Sie müssen das überschreibensrc
Attribut wie oben beschrieben , benötigen jedoch jQuery, um auf Ihr altSrc zuzugreifen. Es konnte nicht mit Vanille-JavaScript funktionieren.Könnte ein wenig hacky wirken, hat aber den Tag in meinem Projekt gerettet.
quelle
ein einfaches img-element ist nicht sehr flexibel, deshalb habe ich es mit einem bildelement kombiniert. Auf diese Weise wird kein CSS benötigt. Wenn ein Fehler auftritt, werden alle srcset auf die Fallback-Version gesetzt. Ein defektes Linkbild wird nicht angezeigt. Es werden keine nicht benötigten Bildversionen geladen. Das Bildelement unterstützt Responsive Design und mehrere Fallbacks für Typen, die vom Browser nicht unterstützt werden.
quelle
eckig2:
quelle
Einfache und übersichtliche Lösung mit einigen guten Antworten und Kommentaren.
Es löst sogar das Endlosschleifenrisiko.
Hat für mich gearbeitet.
quelle
Ein HTML einzige Lösung, wo die einzige Voraussetzung ist , dass Sie wissen , die Größe des Bildes , das Sie Einfügen. Funktioniert nicht für transparente Bilder, da es
background-image
als Füllmaterial verwendet wird.Wir können
background-image
das Bild, das angezeigt wird, wenn das angegebene Bild fehlt, erfolgreich verknüpfen. Dann ist das einzige Problem das kaputte Symbolbild - wir können es entfernen, indem wir ein sehr großes leeres Zeichen einfügen und so den Inhalt außerhalb der Anzeige von verschiebenimg
.Eine reine CSS-Lösung (nur Webkit)
quelle
Es gibt keine Möglichkeit, sicher zu sein, wie viele Clients (Browser) versuchen, Ihre Seite anzuzeigen. Ein zu berücksichtigender Aspekt ist, dass E-Mail-Clients defakte Webbrowser sind und möglicherweise nicht mit solchen Tricks umgehen ...
Als solches sollten Sie AUCH einen Alt / Text mit einer STANDARDBREITE und -HÖHE wie diesen einfügen. Dies ist eine reine HTML-Lösung.
Die andere gute Antwort würde also wie folgt leicht modifiziert:
Ich hatte Probleme mit dem Objekt-Tag in Chrome, aber ich würde mir vorstellen, dass dies auch dafür gilt.
Sie können den Alt / Text so gestalten, dass er SEHR GROSS ist ...
Meine Antwort ist also, Javascript mit einem schönen Alt / Text-Fallback zu verwenden.
Ich fand das auch interessant: Wie man das Alt-Attribut eines Bildes stylt
quelle
Fügen Sie eine modulierbare Version mit JQuery am Ende Ihrer Datei hinzu:
und auf deinem
img
Tag:quelle
Die obige Lösung ist unvollständig , sie hat das Attribut verfehlt
src
.this.src
undthis.attribute('src')
sind NICHT gleich, der erste enthält zum Beispiel den vollständigen Verweis auf das Bildhttp://my.host/error.jpg
, aber das Attribut behält nur den ursprünglichen Wert bei.error.jpg
Richtige Lösung
quelle
Uncaught TypeError: this.attribute is not a function
in Chrome 43.Wenn Sie Angular 1.x verwenden, können Sie eine Direktive einfügen, mit der Sie auf eine beliebige Anzahl von Bildern zurückgreifen können. Das Fallback-Attribut unterstützt eine einzelne URL, mehrere URLs innerhalb eines Arrays oder einen Winkelausdruck unter Verwendung von Bereichsdaten:
Fügen Sie Ihrem Winkel-App-Modul eine neue Fallback-Direktive hinzu:
quelle
Ich musste kürzlich ein Fallback-System bauen, das eine beliebige Anzahl von Fallback-Bildern enthielt. So habe ich es mit einer einfachen JavaScript-Funktion gemacht.
HTML
JavaScript
Ich denke, es ist eine ziemlich leichte Art, mit vielen Fallback-Bildern umzugehen.
quelle
Mit Jquery können Sie Folgendes tun:
quelle
Verwenden Sie für jedes Bild einfach diesen Javascript-Code:
Wo
ptImage
ist eine<img>
Tag-Adresse erhalten vondocument.getElementById()
.quelle
Google hat diese Seite mit den Schlüsselwörtern "image fallback html" verworfen. Da mir jedoch keines der oben genannten Elemente geholfen hat und ich nach einer "SVG-Fallback-Unterstützung für IE unter 9" gesucht habe, habe ich weiter gesucht und Folgendes gefunden:
Es mag nicht zum Thema gehören, aber es hat mein eigenes Problem gelöst und es könnte auch jemand anderem helfen.
quelle
Zusätzlich zu Patricks brillanter Antwort für diejenigen unter Ihnen, die nach einer plattformübergreifenden eckigen js-Lösung suchen, können Sie Folgendes tun:
Hier ist ein Plunk, in dem ich versucht habe, die richtige Lösung zu finden: http://plnkr.co/edit/nL6FQ6kMK33NJeW8DVDY?p=preview
quelle
Wenn Sie ein dynamisches Webprojekt erstellt und das erforderliche Bild in WebContent platziert haben, können Sie mit dem folgenden Code in Spring MVC auf das Bild zugreifen:
Sie können auch einen Ordner mit dem Namen img erstellen und das Bild im Ordner img ablegen und diesen img-Ordner in WebContent ablegen. Anschließend können Sie mit dem folgenden Code auf das Bild zugreifen:
quelle
Gut!! Ich fand diesen Weg praktisch. Überprüfen Sie, ob das Höhenattribut des Bildes 0 ist. Dann können Sie das src-Attribut mit dem Standardbild überschreiben: https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/ Bild
quelle