267 votes

Quel est le moyen valide d'inclure une image sans src?

J'ai une image que je vais dynamiquement remplir avec un src plus tard avec du javascript, mais pour plus de facilité, je veux que la balise image existe au chargement de la page mais qu'elle n'affiche rien. Je sais que est invalide, alors quelle est la meilleure façon de faire cela?

4 votes

Il s'agit d'une question relativement ancienne, mais il est utile de considérer qu'une image sans src est essentiellement sans signification 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 par la suite, car HTML ne fournit pas de moyen de spécifier une image de remplacement qui sera remplie de données plus tard.

1 votes

En utilisant le plugin jQuery de chargement paresseux de Mika Tuupola, il utilise la balise '', donc en un sens, vous devez pointer vers une source, mais cela ne doit pas nécessairement être fait avec l'attribut src.

1 votes

Vous pouvez utiliser l'élément div à la place, veuillez consulter ceci => stackoverflow.com/a/5513934/1395101

254voto

Isius Points 929

Une autre option consiste à intégrer une image vide. N'importe quelle image qui convient à votre objectif fera l'affaire, mais l'exemple suivant encode un GIF qui ne fait que 26 octets - provenant de http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever

Modifier en fonction du commentaire ci-dessous :

Bien sûr, vous devez tenir compte de vos exigences en matière de prise en charge du navigateur. Aucune prise en charge d'IE7 ou moins est notable. http://caniuse.com/datauri

17 votes

Super idée! Pour moi cependant, cela supprime l'élément image - si quelqu'un a besoin d'autres aspects de l'élément img pour s'afficher par exemple le fond et la bordure, essayez src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAA‌​AAALAAAAAABAAEAAAICR‌​AEAOw==" qui est pris à partir d'un gif transparent de 1px x 1px que j'ai créé et passé à travers base64-image.de

4 votes

Vous voudrez peut-être réfléchir à deux fois avant d'intégrer vos ressources avec des URI de données : mobify.com/blog/data-uris-are-slow-on-mobile

1 votes

La viabilité de cette option dépend des navigateurs que vous devez prendre en charge : caniuse.com/datauri

242voto

Ben Blank Points 21786

Alors qu'il n'existe aucun moyen valide d'omettre la source d'une image, il existe des sources qui ne causeront pas de hits au serveur. J'ai récemment eu un problème similaire avec des iframe et j'ai déterminé que //:0 était la meilleure option. Non, vraiment!

Commencer par // (omettre le protocole) fait que le protocole de la page actuelle est utilisé, évitant ainsi les avertissements de "contenu non sécurisé" dans les pages HTTPS. Omettre le nom d'hôte n'est pas nécessaire, mais cela le rend plus court. Enfin, un port de :0 garantit qu'une requête au serveur ne peut pas être faite (ce n'est pas un port valide, selon la spécification).

C'est le seul URL que j'ai trouvé qui n'a provoqué aucun hit au serveur ni aucun 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 des adresses invalides. (Certains navigateurs se contenteraient de faire la requête invalide et attendraient qu'elle se termine.)

Ceci a été testé dans Chrome, Safari 5, FF 3.6, et IE 6/7/8, mais je m'attends à ce que cela fonctionne dans n'importe quel navigateur, car c'est censé être la couche réseau qui annule toute requête tentée.

18 votes

Cette réponse peut entraîner votre pare-feu à vous avertir de l'accès au port 0 par exemple. Ou cela pourrait entraîner un journal de sécurité du serveur. La réponse conseillant about:blank est probablement une meilleure solution.

11 votes

Cela me cause l'affichage d'une icône d'image brisée. Quelqu'un d'autre voit cela? J'utilise le dernier Firefox (27).

11 votes

Cela échoue également le validateur w3c : Mauvaise valeur //:0 pour l'attribut src sur l'élément img : Hôte non valide : hôte vide.

17voto

動靜能量 Points 33008

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 prepend et append. Sinon, si vous avez une balise image comme ça, et que vous voulez la rendre valide, vous pourriez envisager d'utiliser une image factice, comme un gif ou png transparent de 1px.

7 votes

+1 C'est la meilleure réponse. Si la source de l'image est définie dynamiquement de toute façon, l'ensemble de l'élément devrait être ajouté dynamiquement. Si vous ne voulez pas qu'il soit visible avant que la source ne soit définie, je ne vois aucune bonne raison pour laquelle l'élément devrait être là avant cela.

0 votes

Ajouter dynamiquement l'image est généralement mieux, mais cela ajoute le problème de changer le flux de mise en page. Un espace réservé vide de taille égale peut être nécessaire. Parfois, calculer la taille de cet espace réservé peut être difficile si les éléments sont dimensionnés automatiquement. Dans de tels cas, je trouve que l'image vierge intégrée est une meilleure option.

0 votes

Il pourrait également dépendre s'il y a une largeur fixe de la grille du conteneur. S'il y en a, alors il n'y a pas de refonte

15voto

Uberbrady Points 163

Je n'ai pas fait cela depuis un moment, mais j'ai dû traverser cette même situation une fois.

Est mon préféré - le //:0 implique que vous tenterez de faire une connexion HTTP/HTTPS au serveur d'origine sur le port zéro (le port tcpmux?) - ce qui est probablement inoffensif, mais je préfère quand même ne pas le faire. Bon, le navigateur peut voir le port zéro et ne pas envoyer de requête. Mais je préférerais quand même que ce ne soit pas spécifié de cette manière quand ce n'est probablement pas ce que vous voulez dire.

Quoi qu'il en soit, le rendu de about:blank est en réalité très rapide dans tous les navigateurs que j'ai testés. Je l'ai juste jeté dans le validateur du W3C et il n'a pas râlé, donc cela pourrait même être valide.

Édition : Ne faites pas ça; cela ne fonctionne pas sur tous les navigateurs (cela affichera une icône 'image cassée' comme indiqué dans les commentaires pour cette réponse). Utilisez plutôt la solution

0 votes

Cela semble plus propre que de laisser la couche réseau émettre une erreur.

1 votes

Au moins, vous êtes sûr qu'un pare-feu stupide ne demandera pas la permission d'appeler le port 0...

1 votes

Il convient de mentionner que cela affiche l'icône d'image cassée sur Chrome (et probablement également sur d'autres navigateurs)

3voto

user3198797 Points 1

J'utilise personnellement un about:blank src et je gère l'icône d'image cassée en réglant l'opacité de l'élément img à 0.

0 votes

@mystrdat: Pourriez-vous élaborer pourquoi c'est sale? La réponse acceptée, en utilisant "//:0" m'a quand même donné l'icône d'image cassée ainsi qu'une requête bizarre interminable sur Firefox. L'alternative png base64 d'un seul pixel, également avec beaucoup de votes, m'a causé des problèmes lorsque j'ai utilisé comme espace réservé, que ce soit avec ou sans spécifier la hauteur et la largeur. C'est la manière la plus propre que j'ai trouvée pour atteindre mon objectif sans aucune requête inutile et en passant tous les validateurs et linters.

0 votes

Toutes les solutions ci-dessus sont très stupides, y compris celle qui a été acceptée, je ferai une nouvelle réponse une fois que j'aurai un peu plus de temps.

0 votes

@mystrdat: Je serais toujours heureux d'apprendre ce que vous avez à dire à ce sujet?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X