Événement image.onload et cache du navigateur


113

Je souhaite créer une boîte d'alerte après le chargement d'une image, mais si l'image est enregistrée dans le cache du navigateur, l' .onloadévénement ne sera pas déclenché.

Comment déclencher une alerte lorsqu'une image a été chargée, que l'image ait été mise en cache ou non?

var img = new Image();
img.src = "img.jpg";
img.onload = function () {
   alert("image is loaded");
}

Réponses:


153

Lorsque vous générez l'image dynamiquement, définissez la onloadpropriété avant le src.

var img = new Image();
img.onload = function () {
   alert("image is loaded");
}
img.src = "img.jpg";

Fiddle - testé sur les dernières versions de Firefox et Chrome.

Vous pouvez également utiliser la réponse dans ce article , que j'ai adaptée pour une seule image générée dynamiquement:

var img = new Image();
// 'load' event
$(img).on('load', function() {
  alert("image is loaded");
});
img.src = "img.jpg";

Violon


Attendre. Pourquoi votre deuxième exemple de code fait-il la mauvaise chose et est défini .srcavant de définir .onload? Vous aviez raison dans le premier exemple de code, mais vous avez gâché le second. Le second ne fonctionnera pas correctement dans certaines versions d'IE.
jfriend00

1
@ jfriend00 Non, pas un gâchis. Le code de sauvegarde (le 2ème) est exactement pour le cas où le premier cesse de fonctionner. =]Il utilise une .completevérification au cas où l'image était déjà mise en cache, d'où le code la démontrait. Bien sûr, pour la meilleure pratique, vous pouvez toujours définir la srcliaison après tous les gestionnaires.
Fabrício Matté

4
Il n'y a aucune raison de se fier .completedans ce cas. Configurez simplement votre gestionnaire de charge avant de le configurer .srcet il n'est JAMAIS nécessaire. J'ai écrit un diaporama qui est utilisé par des milliers de sites dans tous les navigateurs imaginables et la première technique fonctionne à chaque fois. Il n'est pas nécessaire de vérifier .completelors de la création d'une nouvelle image à partir de zéro comme celle-ci.
jfriend00

Très bien, merci pour la mise à jour de la réponse pour refléter votre raisonnement =]. Aussi @ jfriend00 pourriez-vous vérifier si l'image se charge dans IE? Vous vous demandez si c'est un problème avec mon réseau ou avec IE et l'image.
Fabrício Matté

9
Aujourd'hui également, j'ai trouvé que le kit Web avait besoin img.src = ''avant d'attribuer un nouveau src s'il était utilisé auparavant.
quux

10

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é. Donc, vous devez également déclencher l'événement .complete.

exemple de code:

$("img").one("load", function() {
   //do stuff
}).each(function() {
   if(this.complete || /*for IE 10-*/ $(this).height() > 0)
     $(this).load();
});

6

Il existe deux solutions possibles pour ce type de situation:

  1. Utilisez la solution suggérée sur ce post
  2. Ajoutez un suffixe unique à l'image srcpour forcer le navigateur à la télécharger à nouveau, comme ceci:

    var img = new Image();
    img.src = "img.jpg?_="+(new Date().getTime());
    img.onload = function () {
        alert("image is loaded");
    }

Dans ce code, chaque fois que vous ajoutez l'horodatage actuel à la fin de l'URL de l'image, vous la rendez unique et le navigateur téléchargera à nouveau l'image


44
Tout cela ne fait que vaincre la mise en cache. C'est la MAUVAISE façon de résoudre ce problème. La bonne manière est dans la réponse de Fabricio. Définissez simplement le .onloadgestionnaire avant de définir la .srcvaleur et vous ne manquerez pas l'événement onload dans certaines versions d'IE.
jfriend00

1
oui vous avez raison, mais il n'est pas toujours souhaitable de mettre en cache, parfois les images ne doivent pas être mises en cache. bien sûr, dans cette situation particulière, cela dépend des besoins
haynar

1
Dans mon application angulaire, j'ai essayé tout ce que les autres réponses disent, mais je n'ai pas aidé. Mais forcer à ne pas mettre en cache comme le dit cette réponse a fonctionné pour moi. Donc plus un de moi.
Thanu

La seule solution qui a fonctionné pour moi dans la dernière version de Chrome.
Young Bob

3

J'ai rencontré le même problème aujourd'hui. Après avoir essayé différentes méthodes, je me rends compte que simplement mettre le code de dimensionnement à l'intérieur $(window).load(function() {})au lieu de document.readyrésoudre une partie du problème (si vous n'ajaxez pas la page).


C'est également une bonne réponse pour la situation où le navigateur a une image en cache, fonctionne correctement avec le chargement de la fenêtre
Shocker

exactement le problème auquel je faisais face. changer $(document).readypour $(window).loadrésoudre mon problème.
Tariqul Islam le

0

J'ai trouvé que vous pouvez simplement le faire dans Chrome:

  $('.onload-fadein').each(function (k, v) {
    v.onload = function () {
        $(this).animate({opacity: 1}, 2000);
    };
    v.src = v.src;
});

Définir le .src sur lui-même déclenchera l'événement onload.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.