image.onload事件和浏览器缓存

OTA*_*TAR 99 javascript image-loading

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

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

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

Fab*_*tté 141

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

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

小提琴 - 在最新的Firefox和Chrome版本上测试过.

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

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

小提琴

  • 今天我发现webkit在分配新的src之前需要`img.src =''`如果之前使用的话. (9认同)
  • 在这种情况下,没有理由依赖`.complete`.在设置`.src`之前先设置你的加载处理程序,它永远不需要.我写了一个幻灯片,在每个可以想象的浏览器中都有成千上万的网站使用,第一种技术每次都有效.这样从头开始创建新图像时,无需检查`.complete`. (4认同)

hay*_*nar 9

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

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

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

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

  • 所有这一切都是失败的缓存.这是解决这个问题的错误方法.正确的方法是Fabricio的答案.只需在设置`.src`值之前设置`.onload`处理程序,就不会错过某些版本的IE中的onload事件. (40认同)
  • 是的,你是对的,但并不总是需要缓存,有时不应该缓存图像。当然,在这种特殊情况下,这取决于需要 (2认同)

Tom*_*duy 8

如果已经设置了src,那么在您甚至绑定事件处理程序之前,事件将在缓存的情况下触发.所以,你也应该根据事件触发事件.complete.

代码示例:

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