Was ist der gültige Weg, um ein Bild ohne src einzuschließen?

234

Ich habe ein Bild, das ich später dynamisch mit einem src mit Javascript füllen werde, aber der Einfachheit halber möchte ich, dass das Bild-Tag beim Seitenladen vorhanden ist, aber nichts anzeigt. Ich weiß, dass <img src='' />es ungültig ist. Wie geht das am besten?

jhchen
quelle
4
Dies ist eine relativ alte Frage, aber es lohnt sich zu bedenken, dass ein Bild ohne src im Wesentlichen bedeutungslos ist. Aus diesem Grund muss in der Spezifikation angegeben werden, dass das Bild einen src haben muss , der auf eine eingebettete Ressource verweist. Wenn Sie über Gültigkeit und / oder Semantik nachdenken, sollten Sie das Bild besser weglassen und nachträglich hinzufügen, da HTML keine Möglichkeit bietet, ein Platzhalterbild anzugeben, das später mit Daten gefüllt wird.
BoltClock
1
Bei der Verwendung des mQ Tuy-Plugins zum verzögerten Laden von Mika Tuupola wird das Markup '<img class = "faul" data-original = "img / example.jpg" width = "640" height = "480">' verwendet müssen auf eine Quelle verweisen, müssen jedoch nicht mit dem Attribut src ausgeführt werden.
iWillGetBetter
Sie können div Element stattdessen verwenden, siehe dies => stackoverflow.com/a/5513934/1395101
Amin Ghaderi

Antworten:

237

Während es keine gültige Möglichkeit gibt, die Quelle eines Bildes wegzulassen, gibt es Quellen, die keine Servertreffer verursachen. Ich hatte kürzlich ein ähnliches Problem mit iframes und war fest entschlossen //:0, die beste Option zu sein. Nicht wirklich!

Wenn Sie mit //(Protokoll weglassen) beginnen, wird das Protokoll der aktuellen Seite verwendet, um Warnungen vor "unsicherem Inhalt" auf HTTPS-Seiten zu vermeiden. Das Überspringen des Hostnamens ist nicht erforderlich, verkürzt ihn jedoch. Schließlich stellt ein Port von :0sicher, dass keine Serveranforderung gestellt werden kann (gemäß Spezifikation kein gültiger Port).

Dies ist die einzige URL, die ich gefunden habe und die in keinem Browser Server-Treffer oder Fehlermeldungen verursacht hat. Die übliche Auswahl - javascript:void(0)- führt in IE7 zu einer Warnung "Unsicherer Inhalt", wenn sie auf einer über HTTPS bereitgestellten Seite verwendet wird. Jeder andere Port verursachte einen Serverversuch, selbst bei ungültigen Adressen. (Einige Browser stellen einfach die ungültige Anfrage und warten, bis sie eine Zeitüberschreitung haben.)

Dies wurde in Chrome, Safari 5, FF 3.6 und IE 6/7/8 getestet, aber ich würde erwarten, dass es in jedem Browser funktioniert, da es die Netzwerkschicht sein sollte, die jede versuchte Anforderung abbricht.

Ben Blank
quelle
16
Diese Antwort kann dazu führen, dass Ihre Firewall Sie beispielsweise vor dem Zugriff auf Port 0 warnt. Oder es könnte ein Server-Sicherheitsprotokoll verursachen. Die Antwortberatung about:blankist wahrscheinlich eine bessere Lösung.
Florian Margaine
10
Dies führt dazu, dass ein fehlerhaftes Bildsymbol für mich angezeigt wird. Hat das noch jemand gesehen? Ich benutze den neuesten Firefox (27).
dmikester1
10
Dies schlägt auch fehl w3c validator: Ungültiger Wert //: 0 für Attribut src für Element img: Ungültiger Host: leerer Host.
Ysrb
Dies funktioniert nicht: Ich habe eine ASP.NET MVC 4-Anwendung, die ein Bildergalerie-Plugin namens Clearing enthält. Das Plugin erstellt die Bilder dynamisch und setzt das //: 0 des src, bis das Bild tatsächlich abgerufen wird. Dadurch wurde die Indexaktion meines Homecontrollers zweimal aufgerufen. Hüte dich.
jpgrassi
2
In Firefox 38 löst dieser Ansatz den onerrorHandler des Bildes aus .
Nate Whittaker
221

Eine andere Möglichkeit besteht darin, ein leeres Bild einzubetten. Jedes Bild, das Ihrem Zweck entspricht, reicht aus, aber das folgende Beispiel codiert ein GIF mit nur 26 Byte - von http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever

<img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" width="0" height="0" alt="" />

Bearbeiten basierend auf dem Kommentar unten:

Natürlich müssen Sie die Anforderungen Ihres Browsers berücksichtigen. Es ist keine Unterstützung für IE7 oder weniger bemerkenswert. http://caniuse.com/datauri

Isius
quelle
14
Großartige Idee! Für mich tötet dies jedoch das Bildelement. Wenn jemand andere Aspekte des imgElements benötigt, um z. B. Hintergrund und Rahmen src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="anzuzeigen , versuchen Sie es mit einem transparenten 1px x 1px-GIF, das ich in Photoshop erstellt habe. Base64-image.de
user56reinstatemonica8
4
Vielleicht möchten Sie zweimal darüber nachdenken, Ihre Ressourcen mit Daten-URIs zu versehen: mobify.com/blog/data-uris-are-slow-on-mobile
shawnjan
1
Die Realisierbarkeit
Jeff Clemens
6
Hier ist ein transparentes 1-Pixel-PNG:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgYAAAAAMAASsJTYQAAAAASUVORK5CYII=
Keavon
2
Transparente Bild-URL, die für mich funktioniert hat -data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
Vikram Rao
33

Heutzutage ist meiner Meinung nach der beste kurze, vernünftige und gültige Weg für ein leeres img src wie folgt:

<img src="data:," alt>
or
<img src="data:," alt="Alternative Text">

Das zweite Beispiel zeigt "Alternativer Text" (plus Symbol für defekte Bilder in Chrome und IE).

"data:,"ist eine gültige URI. Ein leerer Medientyp ist standardmäßig text/plain. Es stellt also eine leere Textdatei dar und entspricht"data:text/plain,"


OT: Alle Browser verstehen klar alt. Sie können weglassen ="", es ist implizit gemäß HTML-Spezifikation.

jj
quelle
1
Kein HTML-Fehler bei der W3C-Validatorprüfung. Keine unnötige Anfrage. 👍 Scheint der gültige Weg zu sein, wie es geht.
Kai Noack
Beste! Eine weitere Sache, wenn Sie möchten, dass es in einem srcset validiert wird, verwenden Siesrcset="data:,x"
Lucian Davidescu
18

Ich empfehle, die Elemente dynamisch hinzuzufügen. Wenn Sie jQuery oder eine andere JavaScript-Bibliothek verwenden, ist dies ganz einfach:

schau dir auch an prependund append. Andernfalls können Sie ein Dummy-Bild verwenden, z. B. ein transparentes 1px-GIF oder ein PNG, wenn Sie ein solches Bild-Tag haben und es validieren möchten.

Unpolarität
quelle
7
+1 Dies ist die beste Antwort. Wenn die Bildquelle ohnehin dynamisch eingestellt wird, sollte das gesamte Element dynamisch hinzugefügt werden. Wenn Sie nicht möchten, dass es sichtbar wird, bis der src gesetzt ist, kann ich mir keinen guten Grund vorstellen, warum das Element vorher dort sein sollte.
Andrew Ensley
15

Ich habe das schon eine Weile nicht mehr gemacht, aber ich musste dasselbe einmal durchmachen.

<img src="about:blank" alt="" />

Ist mein Favorit - der //:0impliziert, dass Sie versuchen werden, eine HTTP / HTTPS-Verbindung zum Ursprungsserver an Port Null (dem tcpmux-Port?) Herzustellen - was wahrscheinlich harmlos ist, aber ich würde es sowieso lieber nicht tun. Heck, der Browser kann den Port Null sehen und nicht einmal eine Anfrage senden. Aber ich möchte immer noch lieber, dass es nicht so angegeben wird, wenn Sie das wahrscheinlich nicht meinen.

Wie auch immer, das Rendern von about:blankist in allen von mir getesteten Browsern sehr schnell. Ich habe es einfach in den W3C-Validator geworfen und es hat sich nicht beschwert, also könnte es sogar gültig sein.

Edit : Tu das nicht; Es funktioniert nicht in allen Browsern (es wird ein Symbol für ein fehlerhaftes Bild angezeigt, wie in den Kommentaren zu dieser Antwort angegeben). Verwenden Sie die <img src='data:...unten stehende Lösung. Oder wenn Sie sich nicht um die Gültigkeit kümmern, aber dennoch überflüssige Anforderungen an Ihren Server vermeiden möchten, können Sie <img alt="" />auf kein src-Attribut verzichten. Aber das ist UNGÜLTIGES HTML, also wähle das sorgfältig aus.

Testseite mit einer ganzen Reihe verschiedener Methoden: http://desk.nu/blank_image.php - wird mit allen möglichen Doctypes und Inhaltstypen bereitgestellt. - Verwenden Sie, wie in den Kommentaren unten erwähnt, die neue Testseite von Mark Ormston unter: http://memso.com/Test/BlankImage.html

Uberbrady
quelle
Das scheint sauberer zu sein, als die Netzwerkschicht einen Fehler ausgeben zu lassen.
Denys Séguret
Zumindest sind Sie sicher, dass eine dumme Firewall nicht um die Erlaubnis bittet, Port 0 anzurufen ...
Denys Séguret
1
Es ist erwähnenswert, dass dies das Symbol "
Bildbruch
1
Es ist schlimmer als ich dachte - selbst mit dem HTML5-Doctype scheint es in Safari oder Chrome nicht zu funktionieren. Ich habe eine Testseite, die den Inhaltstyp und den Doctype einer Seite ändert, und bisher ist mein Favorit: <img />- ein Bild-Tag ohne das src-Attribut. Dies ist nicht gültig (so gibt es keinen Grund den leeren alt - Tag in dort setzen, entweder). Ich spiele weiter damit und werde meine Antwort entsprechend aktualisieren (oder durchstreichen).
Uberbrady
2
Ich habe Ihre Testseite genommen und aktualisiert, damit es viel offensichtlicher ist, wenn Bilder nicht richtig funktionieren. Das alte leere Bild ist als Beispiel für "Immer funktioniert" sowie als kurze Beschreibung dessen, was Sie sehen, enthalten: memso.com/Test/BlankImage.html Dies führte mich zu der Erkenntnis, dass das gültige leere Daten-GIF das einzige wiederverwendbare ist Option für moderne Browser, außer dem alten leeren GIF-Bild (das für den alten IE7 und darunter noch erforderlich ist)
Mark Ormston
12

Wie in Kommentaren geschrieben, ist diese Methode falsch.

Ich habe diese Antwort vorher nicht gefunden, aber gemäß den W3- Spezifikationen srcwäre ein gültiges leeres Tag ein Ankerlink #.

Beispiel : src="#",src="#empty"

Seite wird erfolgreich validiert und es werden keine zusätzlichen Anforderungen gestellt.

iGidas
quelle
1
Gibt es Argumente gegen diesen Ansatz? Wie ist es über Browser hinweg?
Tremby
18
Ich habe gesehen, dass sowohl Firefox als auch Chrome bei diesem Ansatz eine zweite Anfrage gestellt haben, daher würde ich es nicht empfehlen.
Marius
5
Firefox, Chrome stellen eine zweite Anfrage, sogar JMeter analysiert das img src, was zu rekursiven Seitenladevorgängen führt (bis die maximale Tiefe erreicht ist)
burna
1
In FF müssen Sie zweimal auf die Schaltfläche "Zurück" des Browsers klicken, wenn Sie die Seite blättern möchten, da sich die URL auf mysteriöse Weise ändert.
Kalaschni
3
Das ist einfach falsch. Jeder, der zufällig Kommentare liest - VERWENDEN SIE DIESES NICHT
Shadow Wizard ist Ear For You
11

Ich habe festgestellt, dass das einfache Setzen des src auf eine leere Zeichenfolge und das Hinzufügen einer Regel zu Ihrem CSS zum Ausblenden des Symbols für fehlerhafte Bilder einwandfrei funktioniert.

[src=''] {
    visibility: hidden;
}
Shawn Walton
quelle
[ng-src = ''] {Sichtbarkeit: versteckt; } Wenn Sie die ng-src-Direktive in anglejs verwenden
Ivan Paredes
1
Beachten Sie, dass der src auf gesetzt sein ''muss und nicht undefiniert sein darf.
Vincent Hoch-Drei
Wenn ich mich nicht irre, wird immer noch eine Anfrage ausgeführt
Nico
9

Wenn Sie das src-Attribut leer lassen, sendet der Browser eine Anfrage an die aktuelle Seiten-URL. Fügen Sie immer 1 * 1 transparentes img in das src-Attribut ein, wenn Sie keine URL möchten

src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA="
Prathamesh Rasam
quelle
1
Dies wird in einigen Browsern als schwarzer Punkt angezeigt.
Thomasz86
IE8 sicher und ältere Versionen von Firefox laut stackoverflow.com/questions/9126105/…
tomasz86
1
Diese src data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==funktionierte jedoch
Max Yari
9

Ich habe das gefunden mit:

<img src="file://null">

wird keine Anfrage stellen und korrekt validieren.

Die Browser blockieren einfach den Zugriff auf das lokale Dateisystem.

Im Konsolenprotokoll in Chrome wird möglicherweise ein Fehler angezeigt, z. B.:

Not allowed to load local resource: file://null/
Tenkod
quelle
2
Möchtest du die Ablehnung erklären? Beachten Sie, dass ich nicht empfehle, diese Methode nur als Diskussionsgrundlage zu verwenden. Und es erfüllt die Anforderungen aus der Frage, korrekt zu validieren und keine zusätzlichen Anfragen zu stellen.
Tenkod
8

Verwenden Sie eine wirklich leere, gültige und hochkompatible SVG-Datei, die auf diesem Artikel basiert :

src="data:image/svg+xml;charset=utf8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%3E%3C/svg%3E"

Die Standardgröße beträgt 300x150px, wie dies bei jeder SVG-Datei der Fall ist. Sie können jedoch in den imgStandardstilen Ihres Elements damit arbeiten, wie Sie es in der praktischen Implementierung möglicherweise in jedem Fall benötigen würden.

mystrdat
quelle
Vielen Dank für die Aktualisierung Ihrer Antwort, aber ich vermute, dass die Kompatibilität dafür noch schlechter ist als bei der anderen Data-Uri-Lösung, da Sie SVG verwenden, das bis IE9 nicht kompatibel war. Glücklicherweise ist es eine Weile her, dass ich Legacy-IE unterstützen musste, aber es ist für einige Leute immer noch relevant.
funkylaundry
Aber hat dies nicht die gleichen Probleme wie in diesem Artikel? dev.mobify.com/blog/data-uris-are-slow-on-mobile . Ich denke, die Option <img src = "about: blank"> mit der Lösung css img [src = "about: blank"] {opacity: 0} ist am besten. Wenn diese Stufe der CSS-Auswahl in älteren Browsern nicht unterstützt wird, geben Sie dem img-Tag einfach eine Klasse wie "load-in" oder so. Besser noch, geben Sie ihm die Klasse, tauschen Sie die Daten-src mit JavaScript aus und legen Sie dann eine Ladefunktion für das Bild fest, damit es beim Laden eingeblendet wird. Sie können auch festlegen, dass ein Spinner angezeigt wird, während er geladen wird. Sieht wirklich professionell aus.
Jordan Carter
@ JordanCarter Sicher, wenn detaillierte Leistung ein Problem ist. Als Nebenbemerkung würde ich sagen, dass visibility: hiddenes etwas passender ist als opacity: 0für die Attributselektoren, die Sie vorschlagen.
Mystrdat
6

Aufbauend auf der Antwort von Ben Blank war die einzige Möglichkeit, diese im w3-Validator zu validieren, wie folgt:

<img src="/./.:0" alt="">`
John Duncan
quelle
Es wird überprüft, führt jedoch in Firefox zu einem fehlerhaften Bild, selbst wenn ein altAttribut leer ist .
James Wright
4

Ich persönlich benutze ein about:blank srcund beschäftige mich mit dem Symbol für defekte Bilder, indem ich die Deckkraft des imgElements auf setze 0.

Miguel
quelle
7
Das ist dreckig!
Mystrdat
@mystrdat: Möchtest du herausfinden, warum es schmutzig ist? Die akzeptierte Antwort mit "//: 0" gab mir immer noch das Symbol für kaputte Bilder sowie eine seltsame, nie endende Anfrage an Firefox. Die Single-Pixel-Base64-PNG-Alternative, ebenfalls mit vielen Stimmen, bereitete mir Probleme, wenn ich das <img> als Platzhalter verwendete, sowohl mit als auch ohne Angabe von Höhe und Breite. Dies ist der sauberste Weg, mein Ziel zu erreichen, ohne unnötige Anfragen zu stellen und alle Linters und Validierungen zu bestehen.
Miguel
Alle oben genannten Lösungen sind sehr albern, die akzeptierte enthalten. Ich werde eine neue Antwort geben, sobald ich mehr Zeit habe.
Mystrdat
@mystrdat: Ich würde mich trotzdem freuen zu erfahren, was Sie dazu zu sagen haben?
funkylaundry
1
@funkylaundry Ich entschuldige mich dafür, dass ich große Ansprüche geltend gemacht habe und verschwunden bin. Ich habe jetzt meine Antwort gepostet. Ich gebe auch zu, dass ich die anderen Daten-URI-Lösungen, denen ich zustimme, noch nicht bemerkt habe, aber ich glaube, dass meine in der Syntax trotzdem überlegen sind.
Mystrdat
4
<img src="invis.gif" />

Wobei invis.gif ein transparentes GIF mit einem Pixel ist. Dies wird in zukünftigen Browserversionen nicht mehr funktionieren und funktioniert seit den 90er Jahren in älteren Browsern.

png sollte auch funktionieren, aber in meinen Tests war das GIF 43 Bytes und das PNG 167 Bytes, also gewann das GIF.

ps vergiss kein alt tag, validatoren mögen sie auch.

Franki
quelle
-1

Einfach so:

<img id="give_me_src"/>
anmml
quelle
4
Keine gute Idee gemäß der Spezifikation : Das src-Attribut muss vorhanden sein und eine gültige URL enthalten ...
Michael Litvin
1
Vielleicht funktioniert es auch in Chrom, aber es WILL Fehler in HTML - Validierung werfen und es ist kein W3 gültig html ...
EhsanT