image.onload事件和浏览器缓存

image.onload event and browser cache

本文关键字:浏览器 缓存 事件 onload image      更新时间:2023-09-26

我想在加载图像后创建一个警报框,但如果图像保存在浏览器缓存中,则不会触发.onload事件。

无论图像是否已缓存,在加载图像时如何触发警报?

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

动态生成图像时,请在src之前设置onload属性。

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

Fiddle-在最新的Firefox和Chrome版本上测试。

你也可以在这篇文章中使用答案,我将其改编为一张动态生成的图像:

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

Fiddle

如果src已经设置,那么在绑定事件处理程序之前,事件就会在缓存的情况下触发。因此,您也应该触发基于.complete的事件。

代码示例:

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

对于这类情况,有两种可能的解决方案:

  1. 使用此帖子中建议的解决方案
  2. 为图像src添加一个唯一的后缀,以强制浏览器再次下载,如下所示:

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

在这段代码中,每次将当前时间戳添加到图像URL的末尾,您都会使其唯一,浏览器将再次下载图像

我今天遇到了同样的问题。在尝试了各种方法后,我意识到只需将调整大小的代码放在$(window).load(function() {})而不是document.ready中就可以解决部分问题(如果您不调整页面)。

我的改进:

document.addEventListener("DOMContentLoaded", function () {
  let el = document.getElementsByTagName("img")
  Object.values(el).forEach(function (el) {
    var img = new Image();
    img.onload = function () {
      el.style.opacity = 1;
    }
    img.src = el.src
  })
});

<style>
  img {
    opacity: 0;
    transition: opacity .4s cubic-bezier(.25, .45, .45, .95);
  }
</style>

我发现你可以在Chrome中做到这一点:

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

将.src设置为自身将触发onload事件。