Savez-vous comment cacher le classique "Image non trouvée" d'une page HTML rendue lorsqu'un fichier image est introuvable ?
Une méthode de travail utilisant JavaScript/jQuery/CSS ?
Savez-vous comment cacher le classique "Image non trouvée" d'une page HTML rendue lorsqu'un fichier image est introuvable ?
Une méthode de travail utilisant JavaScript/jQuery/CSS ?
Malheureusement, je ne peux pas utiliser cette solution car le contenu html est téléchargé à partir d'un site tiers via Json et je ne peux pas le modifier. Merci quand même.
Vous pouvez utiliser le onerror
en JavaScript pour agir lorsqu'une image ne se charge pas :
var img = document.getElementById("myImg");
img.onerror = function () {
this.style.display = "none";
}
En jQuery (puisque vous avez demandé) :
$("#myImg").error(function () {
$(this).hide();
});
Ou pour toutes les images :
$("img").error(function () {
$(this).hide();
// or $(this).css({visibility:"hidden"});
});
Vous devez utiliser visibility: hidden
au lieu de .hide()
si le fait de cacher les images risque de modifier la mise en page. De nombreux sites sur le web utilisent une image par défaut "sans image" à la place, en pointant l'option src
à cette image lorsque l'emplacement de l'image spécifiée n'est pas disponible.
Andy - quelle serait la solution "globale" à appliquer à TOUTES les images ? je pense que ce serait assez facile si elles étaient toutes dans la même div - je me demandais simplement pour TOUTES les images du document...
@jAndy : J'étais presque sûr que c'est le cas, mais votre commentaire m'a fait revérifier. Une recherche rapide sur Google a donné ceci page w3schools (désolé David, si tu lis ceci) indiquant la prise en charge de plusieurs navigateurs.
@jim : Si vous utilisez jQuery, vous pouvez appliquer l'événement à toutes les images. Il suffit d'utiliser le sélecteur de balises, par exemple. $("img").error(function () { /*...*/ });
.
Pour masquer toute erreur d'image, il suffit d'ajouter ce JavaScript au bas de votre page (juste avant la balise de fermeture body) :
(function() {
var allimgs = document.images;
for (var i = 0; i < allimgs.length; i++) {
allimgs[i].onerror = function() {
this.style.visibility = "hidden"; // Other elements aren't affected.
}
}
})();
C'est l'approche que je préfère, car elle permet de s'assurer que les événements onerror sont liés avant que les images n'aient échoué et il n'est pas nécessaire d'ajouter des attributs onerror à chaque balise d'image. Veillez à placer ce code après toutes vos balises d'image mais avant tout autre javascript se trouvant dans <body>, sinon un chargement JS externe bloquant peut provoquer une exécution après une erreur d'image.
Celui-ci fonctionne pour moi, ainsi que le conseil des galates, il faut que cette JS s'exécute avant tout ce qui pourrait la retarder.
Il est peut-être un peu tard pour répondre, mais voici ma tentative. Lorsque j'ai été confronté au même problème, je l'ai résolu en utilisant un div de la taille de l'image et en définissant background-image à ce div. Si l'image n'est pas trouvée, le div est rendu transparent, donc tout est fait silencieusement sans code java-script.
Je fais une recherche rapide sur Andy E Il n'est pas possible de live()
lier error
.
// won't work (chrome 5)
$('img').live('error', function(){
$(this).css('visibility', 'hidden');
});
Donc tu dois faire comme
$('<img/>', {
src: 'http://www.notarget.com/fake.jpg',
error: function(e){
$(this).css('visibility', 'hidden');
}
}).appendTo(document.body);
liant directement le error event handler
sur la création d'un nouvel élément.
+1, la raison en est que le onerror L'événement DOM ne fait pas de bulles. en direct y délégué fonctionnent en plaçant le gestionnaire d'événement plus haut dans la hiérarchie du DOM et en capturant l'événement au fur et à mesure qu'il remonte. Bien sûr, les développeurs de jQuery ont contourné ce problème pour certains événements tels que focus y flou
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.
0 votes
La réponse d'Andy est correcte, cependant, vous pourriez vouloir utiliser style.vsibility à la place. Si vous définissez la visibilité, l'élément conserve son espace sur votre document, donc pas de mouvements bizarres du document.
0 votes
Je ne vois pas l'intérêt. Vous n'êtes tout simplement pas censé essayer d'atteindre des ressources inexistantes à partir de votre code html. L'utilisation de javascript pour cacher les ressources mal gérées me semble être une vilaine solution.
1 votes
Il y a beaucoup d'images liées à chaud qui sont cassées ici sur Stack Overflow parce que les images peuvent être disponibles au moment de la publication, mais indisponibles quelques mois plus tard. Ces images sont silencieusement et doucement cachées.
0 votes
@systempuntoout : les images cassées postées dans les questions affichent l'icône d'image cassée pour moi. Je viens de le tester.
0 votes
Ne serait-il pas bon de vérifier sur le serveur si les images existent toujours et d'agir dans le bon sens afin de ne pas obliger le client à envoyer des requêtes http inutiles ?
0 votes
@Andy uhm..navigateur ? J'utilise FF 3.6.3 et les images cassées sont masquées. J'ai essayé IE 8.0 et les icônes des images cassées sont affichées :S
0 votes
@systempuntoout : J'ai testé dans IE et Google Chrome. Il est possible que Firefox cache les images de lui-même si elles ont un espace vide.
alt
attribut. btw, avez-vous un lien vers la question que vous avez vérifiée ?0 votes
Andy est sûr superuser.com/questions/52671/
0 votes
@Andy la même page utilisant StackPrinter (je suis l'auteur) montre les liens brisés sur FF 3.6.3 . C'est la raison pour laquelle j'ai posé cette question :). stackprinter.appspot.com/
1 votes
@systempuntoout : Je ne sais pas pourquoi les deux sont traités différemment. J'ai testé une image cassée dans Firefox et Chrome, il ne s'affiche pas dans Firefox mais il apparaît comme cassé dans Chrome. Il est clair qu'il s'agit d'une décision prise par Firefox de son propre chef, car il ne semble pas qu'aucun style ne l'affecte.
2 votes
@systempuntoout : J'ai trouvé un peu plus d'informations sur la façon dont Firefox fonctionne avec cela. Voir un mise à jour du violon et la [pseudo-classe propriétaire,
:-moz-broken
]( developer.mozilla.org/fr/CSS/:-moz-broken ). Je me disais tout à l'heure qu'une pseudo classe serait utile pour styliser les images cassées.0 votes
@Andy merci pour les conseils et pour le +1 là-bas :).
0 votes
@systempuntoout : pas de problème du tout :-)