Quelle est la manière valide d'inclure une image sans src?

234

J'ai une image que je remplirai dynamiquement avec un src plus tard avec javascript mais pour plus de facilité, je veux que la balise d'image existe à pageload mais n'affiche simplement rien. Je sais que ce <img src='' />n'est pas valide, alors quelle est la meilleure façon de procéder?

jhchen
la source
4
C'est une question relativement ancienne, mais il vaut la peine de considérer qu'une image sans src est essentiellement dénuée de sens et c'est pourquoi la spécification dit que l'image doit avoir un src pointant vers une ressource intégrée en premier lieu. Si vous pensez à la validité et / ou à la sémantique, vous êtes bien mieux servi en omettant complètement l'image et en l'ajoutant après coup, car HTML ne fournit pas un moyen de spécifier une image d'espace réservé qui sera remplie de données plus tard.
BoltClock
1
En utilisant le plugin jQuery de chargement paresseux de Mika Tuupola, il utilise le balisage '<img class = "lazy" data-original = "img / example.jpg" width = "640" height = "480">', donc dans un sens, vous besoin de pointer vers une source, mais cela ne doit pas être fait avec l'attribut src.
iWillGetBetter
Vous pouvez utiliser l'élément div au lieu de celui-ci, veuillez voir ceci => stackoverflow.com/a/5513934/1395101
Amin Ghaderi

Réponses:

237

Bien qu'il n'y ait aucun moyen valide d'omettre la source d'une image, il existe des sources qui ne provoqueront pas de hits sur le serveur. J'ai récemment eu un problème similaire avec iframes et j'ai décidé //:0d'être la meilleure option. Pas vraiment!

En commençant par //(en omettant le protocole), le protocole de la page actuelle est utilisé, ce qui empêche les avertissements de «contenu non sécurisé» dans les pages HTTPS. Ignorer le nom d'hôte n'est pas nécessaire, mais le raccourcit. Enfin, un port de :0garantit qu'aucune demande de serveur ne peut être faite (ce n'est pas un port valide, selon la spécification).

C'est la seule URL que j'ai trouvée, qui n'a causé aucun accès au serveur ou message d'erreur dans aucun navigateur. Le choix habituel - javascript:void(0)- provoquera un avertissement de "contenu non sécurisé" dans IE7 s'il est utilisé sur une page servie via HTTPS. Tout autre port a provoqué une tentative de connexion au serveur, même pour les adresses non valides. (Certains navigateurs feraient simplement la demande invalide et attendraient qu'ils expirent.)

Cela a été testé dans Chrome, Safari 5, FF 3.6 et IE 6/7/8, mais je m'attendrais à ce qu'il fonctionne dans n'importe quel navigateur, car ce devrait être la couche réseau qui tue toute tentative de demande.

Ben Blank
la source
16
Cette réponse peut amener votre pare-feu à vous avertir de l'accès au port 0 par exemple. Ou cela pourrait provoquer un journal de sécurité du serveur. La réponse conseillant about:blankest probablement une meilleure solution.
Florian Margaine
10
Cela provoque une icône d'image cassée pour moi. Quelqu'un d'autre a vu ça? J'utilise le dernier Firefox (27).
dmikester1
10
Cela échoue également au validateur w3c: valeur incorrecte //: 0 pour l'attribut src sur l'élément img: hôte non valide: hôte vide.
ysrb
Cela ne fonctionne pas: j'ai une application ASP.NET MVC 4 qui contient un plugin de galerie d'images appelé clearing. Le plugin crée les images dynamiquement et met le //: 0 o le src jusqu'à ce que l'image soit réellement récupérée. Cela faisait que l'action d'index de mon homecontroller était appelée deux fois. Alors méfiez-vous.
jpgrassi
2
Dans Firefox 38, cette approche déclenche le onerrorgestionnaire d'image .
Nate Whittaker
221

Une autre option consiste à incorporer une image vierge. Toute image qui convient à votre objectif fera l'affaire, mais l'exemple suivant code un GIF de seulement 26 octets - à partir de http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever

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

Modifier en fonction du commentaire ci-dessous:

Bien sûr, vous devez tenir compte des exigences de prise en charge de votre navigateur. Aucun support pour IE7 ou moins n'est notable. http://caniuse.com/datauri

Isius
la source
14
Bonne idée! Pour moi, cependant, cela tue l'élément image - si quelqu'un a besoin d'autres aspects de l' imgélément pour afficher, par exemple, l'arrière-plan et la bordure, essayez celui src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="qui est tiré d'un gif transparent 1px x 1px que j'ai fait que j'ai poussé Photoshop via base64-image.de
user56reinstatemonica8
4
Vous voudrez peut-être réfléchir à deux fois avant d'inclure vos ressources avec des URI de données: mobify.com/blog/data-uris-are-slow-on-mobile
shawnjan
1
La viabilité de cette option dépend des navigateurs que vous devez prendre en charge: caniuse.com/datauri
Jeff Clemens
6
Voici un PNG transparent à 1 pixel:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgYAAAAAMAASsJTYQAAAAASUVORK5CYII=
Keavon
2
URL d'image transparente qui a fonctionné pour moi -data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
Vikram Rao
34

Ces jours-ci, à mon humble avis, le meilleur moyen court, sain et valide pour un src img vide est comme ceci:

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

Le deuxième exemple affiche "Texte alternatif" (plus l'icône d'image cassée dans Chrome et IE).

"data:,"est un URI valide. Par défaut, un type de support vide est text/plain. Il représente donc un fichier texte vide et équivaut à"data:text/plain,"


OT: Tous les navigateurs comprennent tout simplement alt. Vous pouvez omettre ="", c'est implicite par spécification HTML.

jj
la source
1
Aucune erreur HTML avec vérification du validateur W3C. Aucune demande inutile. 👍 Semble être le moyen valable de le faire.
Kai Noack
Meilleur! Encore une chose, si vous voulez qu'il soit validé dans un srcset, utilisezsrcset="data:,x"
Lucian Davidescu
18

Je recommande d'ajouter dynamiquement les éléments, et si vous utilisez jQuery ou une autre bibliothèque JavaScript, c'est assez simple:

regardez aussi prependet append. Sinon, si vous avez une balise d'image comme celle-ci et que vous souhaitez la valider, vous pouvez envisager d'utiliser une image fictive, telle qu'un gif transparent 1px ou png.

non-polarité
la source
7
+1 C'est la meilleure réponse. Si la source d'image est de toute façon définie dynamiquement, l'élément entier doit être ajouté dynamiquement. Si vous ne voulez pas qu'il soit visible jusqu'à ce que le src soit défini, je ne vois aucune bonne raison pour laquelle l'élément devrait être là avant cela.
Andrew Ensley
15

Je n'ai pas fait ça depuis un moment, mais j'ai dû passer par la même chose une fois.

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

Est mon préféré - //:0celui qui implique que vous essayerez d'établir une connexion HTTP / HTTPS au serveur d'origine sur le port zéro (le port tcpmux?) - qui est probablement inoffensif, mais je préfère ne pas le faire de toute façon. Heck, le navigateur peut voir le port zéro et même pas envoyer de demande. Mais je préfère quand même que ce ne soit pas spécifié de cette façon, alors que ce n'est probablement pas ce que vous voulez dire.

Quoi qu'il en soit, le rendu de about:blankest en fait très rapide dans tous les navigateurs que j'ai testés. Je viens de le jeter dans le validateur W3C et il ne s'est pas plaint, donc il pourrait même être valide.

Edit : Ne faites pas ça; cela ne fonctionne pas sur tous les navigateurs (il affichera une icône 'image cassée' comme indiqué dans les commentaires de cette réponse). Utilisez la <img src='data:...solution ci-dessous. Ou si vous ne vous souciez pas de la validité, mais que vous souhaitez toujours éviter les demandes superflues à votre serveur, vous pouvez le faire <img alt="" />sans attribut src. Mais c'est du HTML INVALIDE alors choisissez-le soigneusement.

Page de test montrant un tas de méthodes différentes: http://desk.nu/blank_image.php - servi avec toutes sortes de doctypes et de types de contenu différents. - comme mentionné dans les commentaires ci-dessous, utilisez la nouvelle page de test de Mark Ormston sur: http://memso.com/Test/BlankImage.html

Uberbrady
la source
Cela semble plus propre que de laisser la couche réseau émettre une erreur.
Denys Séguret du
Au moins, vous êtes sûr qu'un pare-feu stupide ne demandera pas la permission d'appeler le port 0 ...
Denys Séguret
1
Il convient de mentionner que cela affiche l'icône `` image cassée '' sur Chrome (et probablement d'autres navigateurs aussi)
user56reinstatemonica8
1
C'est pire que je ne le pensais - même avec le doctype html5, il ne semble pas fonctionner dans Safari ou Chrome. J'ai une page de test vers le haut qui va tordre le Content-type et Doctype d'une page, et jusqu'à présent, mon préféré est: <img />- une balise d'image sans l'attribut src. Ce n'est pas valide (il n'y a donc aucun intérêt à y mettre la balise alt vide). Je continue de jouer avec et je mettrai à jour ma réponse (ou je la barrerai) en conséquence.
Uberbrady
2
J'ai pris votre page de test et l'ai mise à jour, donc c'est beaucoup plus évident lorsque les images ne fonctionnent pas correctement. L'ancienne image vierge est incluse en tant qu'exemple "Always Works", ainsi qu'une brève description de ce que vous voyez: memso.com/Test/BlankImage.html Cela m'a amené à réaliser que le gif de données vides valide est le seul réutilisable option pour les navigateurs modernes, autre que l'ancienne image gif vierge (qui est toujours requise pour les anciens IE7 et inférieurs)
Mark Ormston
12

Comme écrit dans les commentaires, cette méthode est erronée.

Je n'ai pas trouvé cette réponse auparavant, mais selon une balise vide valide des spécifications W3src serait un lien d'ancrage #.

Exemple: src="#",src="#empty"

La page est validée avec succès et aucune demande supplémentaire n'est effectuée.

iGidas
la source
1
Y a-t-il des arguments contre cette approche? Comment est-ce à travers les navigateurs?
tremby
18
J'ai vu Firefox et Chrome faire une deuxième demande en utilisant cette approche, donc je ne le recommanderais pas.
Marius
5
Firefox, Chrome font une deuxième demande, même JMeter analyse l'img src, ce qui entraîne des chargements de page récursifs (jusqu'à ce que la profondeur maximale soit atteinte)
burna
1
Dans FF, vous devez appuyer deux fois sur le bouton de retour des navigateurs si vous voulez
quitter
3
C'est tout à fait faux. Tous ceux qui lisent des commentaires - N'UTILISEZ PAS CELA
Shadow Wizard est Ear For You
11

J'ai trouvé que simplement définir le src sur une chaîne vide et ajouter une règle à votre CSS pour masquer l'icône d'image cassée fonctionne très bien.

[src=''] {
    visibility: hidden;
}
Shawn Walton
la source
[ng-src = ''] {visibilité: cachée; } si vous utilisez la directive ng-src dans angularjs
Ivan Paredes
1
Notez que le src doit être défini sur '', il ne doit pas être indéfini.
Vincent Hoch-Drei
Si je ne me trompe pas, une demande sera toujours effectuée
Nico
9

si vous gardez l'attribut src vide, le navigateur enverra une demande à l'URL de la page actuelle ajoutez toujours 1 * 1 img transparent dans l'attribut src si vous ne voulez pas d'url

src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA="
Prathamesh Rasam
la source
1
Celui-ci sera affiché sous forme de point noir dans certains navigateurs.
tomasz86
IE8 pour sûr, et les anciennes versions de Firefox selon stackoverflow.com/questions/9126105/…
tomasz86
1
ce src data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==a bien fonctionné
Max Yari
9

J'ai trouvé cela en utilisant:

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

ne fera pas de demande et valide correctement.

Les navigateurs bloqueront simplement l'accès au système de fichiers local.

Mais il pourrait y avoir une erreur affichée dans le journal de la console dans Chrome, par exemple:

Not allowed to load local resource: file://null/
tenkod
la source
2
Voulez-vous expliquer le downvote? Notez que je ne recommande pas d'utiliser cette méthode simplement pour fournir un cas de discussion. Et c'est satisfaire les exigences de la question pour valider correctement et ne pas faire de demandes supplémentaires.
tenkod
8

Utilisez un SVG vraiment vierge, valide et hautement compatible, basé sur cet article :

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

Sa taille par défaut sera de 300x150px comme n'importe quel SVG, mais vous pouvez travailler avec cela dans les imgstyles par défaut de vos éléments, comme vous en auriez probablement besoin dans tous les cas dans l'implémentation pratique.

mystrdat
la source
Merci d'avoir mis à jour votre réponse, mais je soupçonne que la compatibilité est encore pire pour cela, que l'autre solution data-uri, étant donné que vous utilisez svg qui n'était pas compatible avant IE9. Heureusement, cela fait un moment que je n'ai pas dû prendre en charge l'ancien IE, mais il est toujours pertinent pour certaines personnes.
funkylaundry
Mais cela ne souffre-t-il pas des mêmes problèmes que dans cet article? dev.mobify.com/blog/data-uris-are-slow-on-mobile . Je pense que l'option <img src = "about: blank"> avec la solution css img [src = "about: blank"] {opacity: 0} est la meilleure. Ou, si ce niveau de sélecteur CSS n'est pas pris en charge dans les anciens navigateurs, donnez simplement à la balise img une classe telle que «chargement» ou quelque chose du genre. Mieux encore, donnez-lui la classe, utilisez JavaScript pour échanger le data-src, puis définissez une fonction de chargement sur l'image pour la faire apparaître en charge. Vous pouvez également définir un spinner à afficher pendant le chargement. Ça a l'air vraiment professionnel.
Jordan Carter
@JordanCarter Bien sûr, si les performances détaillées sont un sujet de préoccupation. En résumé, je dirais que visibility: hiddenc'est un peu plus approprié que opacity: 0pour les sélecteurs d'attributs que vous proposez.
mystrdat
6

À partir de la réponse de Ben Blank, la seule façon de valider cela dans le validateur w3 était la suivante:

<img src="/./.:0" alt="">`
John Duncan
la source
Il valide, mais il en résulte une image cassée dans Firefox, même avec un altattribut vide .
James Wright
4

J'utilise personnellement un about:blank srcet traite l'icône de l'image cassée en définissant l'opacité de l' imgélément sur 0.

Miguel
la source
7
Maintenant c'est sale!
mystrdat
@mystrdat: Vous voulez savoir pourquoi c'est sale? La réponse acceptée, en utilisant "//: 0" m'a toujours donné l'icône d'image cassée plus une demande sans fin étrange sur Firefox. L'alternative au pixel unique base64 png, également avec beaucoup de votes, m'a posé des problèmes lors de l'utilisation de <img> comme espace réservé, à la fois avec et sans spécifier la hauteur et la largeur. C'est le moyen le plus propre que j'ai trouvé pour atteindre mon objectif sans aucune demande inutile et sans passer par tous les linters et validations.
Miguel
Toutes les solutions ci-dessus sont très stupides celle acceptée incluse, je ferai une nouvelle réponse une fois que j'aurai plus de temps.
mystrdat
@mystrdat: Je serais toujours heureux d'apprendre ce que vous avez à dire à ce sujet?
funkylaundry
1
@funkylaundry Je m'excuse d'avoir fait de grosses réclamations et d'avoir disparu, a posté ma réponse maintenant. J'admets également que je n'ai jamais remarqué les autres solutions Data URI auparavant, avec lesquelles je suis d'accord, mais je pense que la mienne est supérieure dans la syntaxe de toute façon.
mystrdat
4
<img src="invis.gif" />

Où invis.gif est un gif transparent à un pixel. Cela ne cassera pas dans les futures versions de navigateur et fonctionne dans les navigateurs hérités depuis les années 90.

png devrait aussi fonctionner mais dans mes tests, le gif était de 43 octets et le png était de 167 octets donc le gif a gagné.

ps n'oubliez pas une balise alt, les validateurs comme eux aussi.

franki
la source
-1

Simplement, comme ça:

<img id="give_me_src"/>
anmml
la source
4
Pas une bonne idée selon la spécification : l' attribut src doit être présent et doit contenir une URL valide ...
Michael Litvin
1
Peut - être que cela fonctionne bien en chrome, mais il FERA lancer des erreurs dans la validation html et ce n'est pas valide html W3 ...
EhsanT