J'ai une page Web qui comprend un tas d'images. Parfois, l'image n'est pas disponible, donc une image cassée est affichée dans le navigateur du client.
Comment utiliser jQuery pour obtenir l'ensemble d'images, le filtrer sur des images cassées puis remplacer le src?
- Je pensais qu'il serait plus facile de le faire avec jQuery, mais il s'est avéré beaucoup plus facile d'utiliser simplement une solution JavaScript pure, c'est-à-dire celle fournie par Prestaul.
javascript
jquery
html
brokenimage
Dan Lord
la source
la source
J'utilise le
error
gestionnaire intégré :Edit: La
error()
méthode est déconseillée dans jquery 1.8 et supérieur. Au lieu de cela, vous devez utiliser à la.on("error")
place:la source
Dans le cas où quelqu'un comme moi, essaie d'attacher l'
error
événement à un HTML dynamiqueimg
balise , je voudrais souligner qu'il y a un hic:Apparemment,
img
les événements d'erreur ne se propagent pas dans la plupart des navigateurs, contrairement à ce que la norme dit .Donc, quelque chose comme ce qui suit ne fonctionnera pas :
J'espère que cela sera utile à quelqu'un d'autre. J'aimerais avoir vu ça ici dans ce fil. Mais je ne l'ai pas fait. Donc, je l'ajoute
la source
Voici une solution autonome:
la source
$.browser
a été déprécié et supprimé maintenant, utilisez plutôt la détection des fonctionnalités (devient plus compliqué dans ce cas).204 No Content
ce sera une image cassée.Je crois que c'est ce que vous recherchez: jQuery.Preload
Voici l'exemple de code de la démo, vous spécifiez le chargement et les images non trouvées et vous êtes prêt:
la source
Source: http://www.developria.com/2009/03/jquery-quickie---broken-images.html
la source
Alors que le PO cherchait à remplacer le SRC, je suis sûr que de nombreuses personnes qui ont posé cette question ne souhaitent que masquer l'image cassée, auquel cas cette solution simple a très bien fonctionné pour moi.
Utilisation de JavaScript en ligne:
Utilisation de JavaScript externe:
Utilisation de JavaScript externe moderne:
Voir la prise en charge du navigateur pour les fonctions NoteList.forEach et arrow .
la source
Voici un moyen rapide et sale de remplacer toutes les images cassées, et il n'est pas nécessaire de changer le code HTML;)
exemple de codepen
la source
Je n'ai pas pu trouver de script adapté à mes besoins, j'ai donc créé une fonction récursive pour vérifier les images cassées et tenter de les recharger toutes les quatre secondes jusqu'à ce qu'elles soient corrigées.
Je l'ai limité à 10 tentatives comme s'il n'était pas chargé d'ici là, l'image pourrait ne pas être présente sur le serveur et la fonction entrerait dans une boucle infinie. Je teste toujours. N'hésitez pas à le modifier :)
la source
C'est une technique merdique, mais elle est à peu près garantie:
la source
Vous pouvez utiliser la propre extraction de GitHub pour cela:
Frontend: https://github.com/github/fetch
ou pour Backend, une version Node.js: https://github.com/bitinn/node-fetch
Edit: Cette méthode va remplacer XHR et aurait déjà été dans Chrome. Si vous lisez ceci à l'avenir, vous n'aurez peut-être pas besoin de la bibliothèque susmentionnée.
la source
Ceci est JavaScript, devrait être compatible avec tous les navigateurs et fournit sans le balisage laid
onerror=""
:CODEPEN:
la source
while (i--)
Mieux appeler en utilisant
Parce que l'utilisation
document.ready
n'implique pas nécessairement que les images sont chargées, seul le HTML. Ainsi, aucun appel différé n'est nécessaire.la source
Variante CoffeeScript :
Je l'ai fait pour résoudre un problème avec Turbolinks qui provoque parfois l'apparition de la méthode .error () dans Firefox même si l'image est vraiment là.
la source
En utilisant la réponse de Prestaul , j'ai ajouté quelques vérifications et je préfère utiliser la méthode jQuery.
la source
Si vous avez inséré votre
img
avecinnerHTML
, comme:,$("div").innerHTML = <img src="wrong-uri">
vous pouvez charger une autre image si elle échoue, par exemple ceci:Pourquoi est-il
javascript: _
nécessaire? Parce que les scripts injectés dans le DOM via des balises de script dansinnerHTML
ne sont pas exécutés au moment où ils sont injectés, vous devez donc être explicite.la source
J'ai trouvé ce post en regardant cet autre post SO . Vous trouverez ci-dessous une copie de la réponse que j'ai donnée là-bas.
Je sais que c'est un vieux fil, mais React est devenu populaire et, peut-être, quelqu'un utilisant React viendra ici à la recherche d'une réponse au même problème.
Donc, si vous utilisez React, vous pouvez faire quelque chose comme ci-dessous, qui était une réponse originale fournie par Ben Alpert de l'équipe React ici
la source
J'ai créé un violon pour remplacer l'image cassée en utilisant l'événement "onerror". Cela peut vous aider.
la source
Voici un exemple utilisant l'objet Image HTML5 encapsulé par JQuery. Appelez la fonction de chargement pour l'URL de l'image principale et si cette charge provoque une erreur, remplacez l'attribut src de l'image par une URL de sauvegarde.
la source
Pure JS. Ma tâche était: si l'image 'bl-once.png' est vide -> insérer la première image (qui n'a pas le statut 404) de la liste des tableaux (dans le répertoire courant):
Il faut peut-être l'améliorer, mais:
Ainsi, il insérera le 'required.png' correct dans mon src ou 'no-image.png' du répertoire actuel.
la source
Je ne sais pas s'il y a une meilleure façon, mais je peux penser à un hack pour l'obtenir - vous pouvez Ajax poster sur l'URL img et analyser la réponse pour voir si l'image est effectivement revenue. Si elle est revenue en tant que 404 ou quelque chose, échangez l'img. Bien que je m'attende à ce que ce soit assez lent.
la source
J'ai résolu mon problème avec ces deux fonctions simples:
la source
jQuery 1.8
jQuery 3
référence
la source
Je pense que j'ai une manière plus élégante avec la délégation d'événements et la capture d'événements
window
,error
même lorsque l'image de sauvegarde ne parvient pas à se charger.Le point est:
Mettez le code dans
head
et exécuté comme premier script en ligne. Ainsi, il écoutera les erreurs qui se produisent après le script.Utilisez la capture d'événements pour détecter les erreurs, en particulier pour les événements qui ne bouillonnent pas.
Utilisez la délégation d'événements qui évite de lier des événements sur chaque image.
Donnez à l'
img
élément error un attribut après leur avoir donné unbackup.png
pour éviter la disparition de labackup.png
boucle infinie et des suivantes comme ci-dessous:img error-> backup.png-> error-> backup.png-> error -> ,,,,,
la source
let isImgErrorHandled = target.src === 'backup.png';
car cela simplifie un peu.target.src='backup.png'
mais la prochaine foisconsole.log(target.src)
pourrait ne pas êtrebackup.png
Vous pouvez passer un chemin réservé et y accéder à toutes les propriétés de l'objet image défaillant via
$*
:http://jsfiddle.net/ARTsinn/Cu4Zn/
la source
Cela me frustre depuis des années. Ma correction CSS définit une image d'arrière-plan sur le
img
. Lorsqu'une image dynamiquesrc
ne se charge pas au premier plan, un espace réservé est visible sur leimg
bg du. Cela fonctionne si vos images ont une taille par défaut (par exempleheight
,min-height
,width
et / oumin-width
).Vous verrez l'icône d'image cassée mais c'est une amélioration. Testé avec succès vers IE9. iOS Safari et Chrome ne montrent même pas d'icône cassée.
Ajoutez une petite animation pour donner le
src
temps de charger sans scintillement d'arrière-plan. Chrome s'estompe en arrière-plan en douceur, mais pas Safari de bureau.la source
Si l'image ne peut pas être chargée (par exemple, car elle n'est pas présente à l'URL fournie), l'URL de l'image sera remplacée par défaut,
Pour en savoir plus sur .error ()
la source
J'ai le même problème. Ce code fonctionne bien sur mon cas.
la source
Parfois, l'utilisation de l'
error
événement n'est pas possible, par exemple parce que vous essayez de faire quelque chose sur une page qui est déjà chargée, comme lorsque vous exécutez du code via la console, un bookmarklet ou un script chargé de manière asynchrone. Dans ce cas, vérifier celaimg.naturalWidth
etimg.naturalHeight
sont 0 semble faire l'affaire.Par exemple, voici un extrait pour recharger toutes les images cassées à partir de la console:
la source
J'ai trouvé que cela fonctionnait mieux, si une image ne se charge pas la première fois, elle est complètement supprimée du DOM. L'exécution
console.clear()
maintient la fenêtre de la console propre, car les erreurs 404 ne peuvent pas être omises avec les blocs try / catch.la source