Je veux faire:
$("img").bind('load', function() {
// do stuff
});
Mais l'événement de chargement ne se déclenche pas lorsque l'image est chargée à partir du cache. Les documents jQuery suggèrent un plugin pour résoudre ce problème, mais cela ne fonctionne pas
jquery
image
jquery-events
jquery-load
Tom Lehman
la source
la source
Réponses:
Si le
src
est déjà défini, l'événement se déclenche dans le cas mis en cache, avant même que le gestionnaire d'événements ne soit lié. Pour résoudre ce problème, vous pouvez parcourir en boucle la vérification et le déclenchement de l'événement en fonction.complete
, comme ceci:Notez la modification de
.bind()
à.one()
afin que le gestionnaire d'événements ne s'exécute pas deux fois.la source
setTimeout(function(){//do stuff},0)
dans la fonction 'charger' ... le 0 donne au système de navigateur (DOM) une coche supplémentaire pour s'assurer que tout est correctement mis à jour..load()
ne déclenche pas d'événement et a 1 argument requis, utilisez.trigger("load")
plutôtPuis-je vous suggérer de le recharger dans un objet image non DOM? S'il est mis en cache, cela ne prendra pas de temps du tout et la charge continuera de se déclencher. S'il n'est pas mis en cache, il déclenchera la onload lors du chargement de l'image, ce qui devrait être en même temps que la version DOM de l'image termine le chargement.
Javascript:
Mise à jour (pour gérer plusieurs images et avec une pièce jointe correctement commandée):
la source
load
gestionnaire avant qu'il ne soit ajouté, cela ne fonctionnera pas non plus, mais pour une image, le code OP fonctionne pour beaucoup :)#img
est un ID pas un sélecteur d'élément :) Fonctionne égalementthis.src
, pas besoin d'utiliser jQuery là où il n'est pas nécessaire :) Mais créer une autre image semble exagéré dans les deux cas IMO.imageLoaded
, utilisez alorstmp.onload = imageLoaded.bind(this)
Ma solution simple, elle n'a besoin d'aucun plugin externe et pour les cas courants devrait suffire:
utilisez-le comme ceci:
par exemple, pour estomper vos images au chargement, vous pouvez faire:
Ou comme alternative, si vous préférez une approche de type plugin jquery:
et utilisez-le de cette manière:
par exemple:
la source
width
,max-height
et les congésheight:auto
, il est souvent nécessaire de définir à la fois que la largeur et la hauteur si vous avez besoin d'étirer l'image; pour une solution plus robuste, j'utiliserais un plugin comme ImagesLoadedDevez-vous vraiment le faire avec jQuery? Vous pouvez également joindre l'
onload
événement directement à votre image;Il se déclenchera à chaque chargement de l'image, depuis le cache ou non.
la source
onload
gestionnaire se déclenchera-t-il lorsque l'image sera chargée une deuxième fois depuis le cache?Vous pouvez également utiliser ce code avec la prise en charge des erreurs de chargement:
la source
load
gestionnaire, puis de l'appeler plus tard dans laeach
fonction.Je viens d'avoir ce problème moi-même, j'ai cherché partout une solution qui n'impliquait pas de tuer mon cache ou de télécharger un plugin.
Je n'ai pas vu ce fil immédiatement, j'ai donc trouvé autre chose à la place qui est une solution intéressante et (je pense) digne d'être publiée ici:
J'ai en fait eu cette idée dans les commentaires ici: http://www.witheringtree.com/2009/05/image-load-event-binding-with-ie-using-jquery/
Je ne sais pas pourquoi cela fonctionne, mais j'ai testé cela sur IE7 et où il s'est cassé avant qu'il ne fonctionne maintenant.
J'espère que ça aide,
Éditer
La réponse acceptée explique en fait pourquoi:
la source
$image.load(function(){ something(); }).attr('src', $image.attr('src'));
pour réinitialiser la source d'origine.En utilisant jQuery pour générer une nouvelle image avec le src de l'image et en lui affectant directement la méthode de chargement, la méthode de chargement est appelée avec succès lorsque jQuery a fini de générer la nouvelle image. Cela fonctionne pour moi dans IE 8, 9 et 10
la source
Une solution que j'ai trouvée https://bugs.chromium.org/p/chromium/issues/detail?id=7731#c12 (Ce code provient directement du commentaire)
la source
Une modification de l'exemple de GUS:
Définissez la source avant et après l'onload.
la source
src
avant l'attachement duonload
gestionnaire, une fois après suffira.Il suffit de rajouter l'argument src sur une ligne distincte après la définition de l'objet img. Cela incitera IE à déclencher l'événement lad. C'est moche, mais c'est la solution de contournement la plus simple que j'ai trouvée jusqu'à présent.
la source
Je peux vous donner un petit conseil si vous voulez faire comme ça:
Si vous faites cela lorsque le navigateur met en cache des images, ce n'est pas un problème, toujours img affiché, mais en chargeant img sous une image réelle.
la source
J'ai eu ce problème avec IE où l'e.target.width ne serait pas défini. L'événement de chargement se déclencherait mais je n'ai pas pu obtenir les dimensions de l'image dans IE (chrome + FF a fonctionné).
Il se trouve que vous devez chercher e.currentTarget.naturalWidth & e.currentTarget.naturalHeight .
Encore une fois, IE fait les choses à sa façon (plus compliquée).
la source
Vous pouvez résoudre votre problème en utilisant le plugin JAIL qui vous permet également de charger des images paresseuses (améliorant les performances de la page) et de passer le rappel en paramètre
Le HTML devrait ressembler à
la source
Si vous voulez une solution CSS pure, cette astuce fonctionne très bien - utilisez l'objet transform. Cela fonctionne également avec les images lorsqu'elles sont mises en cache ou non:
CSS:
HTML:
Exemple de Codepen
Exemple Codepen LESS
la source