93 votes

Comment masquer silencieusement l'icône "Image non trouvée" lorsque l'image source est introuvable ?

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 ?

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.

116voto

Gary Willoughby Points 13366
<img onerror='this.style.display = "none"'>

0 votes

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.

9 votes

Génial, juste ce dont j'avais besoin. Simple et peu encombrant, il tient dans un gabarit !

0 votes

Bien qu'il soit déjà assez vieux, c'est génial ! Existe-t-il un moyen de cacher les balises <a> entourant mon image maintenant cachée ?

103voto

Andy E Points 132925

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.

1 votes

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...

0 votes

@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.

2 votes

@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 () { /*...*/ }); .

7voto

Q_Mlilo Points 716

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. 
        }
    }
})();

0 votes

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.

0 votes

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.

0 votes

Cela répond à la question initiale, mais c'est un processus à sens unique. Pour rendre à nouveau visibles les images qui se chargent ultérieurement, ajoutez également un événement onload. allimgs[i].onload = function() { this.style.visibility = "visible" ; } ;

5voto

Adway Lele Points 145

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.

4voto

jAndy Points 93076

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.

2 votes

+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

0 votes

@Andy E : Yay, ils ont déjà contourné cela, ce n'est peut-être pas la pire des idées de faire la même chose pour error . On dirait un nice to have pour moi.

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