image.événement de chargement et cache du navigateur

je veux créer une boîte d'alerte après une image est chargée, mais si l'image est enregistrée dans le cache du navigateur, le .onload l'é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");
}
82
demandé sur kgrote 2012-09-10 19:31:04

5 réponses

comme vous générez l'image dynamiquement, définissez la propriété onload avant la propriété 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 post , que j'ai adapté 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

114
répondu Fabrício Matté 2017-05-23 11:47:21

il y a deux solutions possibles pour ce genre de situations:

  1. utilisez la solution suggérée sur this post
  2. ajoutez un suffixe unique à l'image src pour forcer le navigateur à le 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 un horodatage courant à la fin de L'URL de l'image, vous le rendez unique et navigateur va télécharger à nouveau l'image

12
répondu haynar 2017-05-23 11:47:21

si le src est déjà défini, alors l'événement se déclenche dans le cas caché avant même que le gestionnaire d'événements ne soit lié. Donc, vous devez déclencher l'événement basé sur .complete aussi.

exemple de code:

$("img").one("load", function() {
   //do stuff
}).each(function() {
   if(this.complete || /*for IE 10-*/ $(this).height() > 0)
     $(this).load();
});
7
répondu Tom Sarduy 2016-05-02 22:55:15

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

2
répondu user9319 2013-01-03 06:32:25

j'ai trouvé que vous pouvez juste faire cela dans Chrome:

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

réglage du .src pour lui-même va déclencher l'événement onload.

0
répondu Noah Ellman 2017-02-01 08:15:31