image.onload事件和浏览器缓存


113

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

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

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

Answers:


153

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

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";

小提琴


等待。为什么您的第二个代码示例.src在设置.onload之前做错了事情并进行了设置?您在第一个代码示例中是正确的,但在第二个示例中弄糟了。第二个在某些版本的IE中将无法正常工作。
jfriend00 2012年

1
@ jfriend00不,不是一团糟。备份代码(第二个)恰好适合第一个以某种方式停止工作的情况。如果图像已经被缓存,=]它将利用.complete检查,因此代码在演示它。当然,为了最佳实践,您始终可以设置src所有处理程序的绑定。
法布里西奥磨砂

4
.complete在这种情况下,没有理由要依靠。只需在设置之前先设置您的负载处理程序.src,就不需要了。我编写了一张幻灯片,在每种可能的浏览器中,成千上万的网站都在使用该幻灯片,并且第一种技术每次都有效。.complete像这样从头开始创建新图像时,无需检查。
jfriend00 2012年

好了,谢谢大家的注意,更新了答案以反映您的推理=]。还@ jfriend00您可以检查图像是否在IE中加载吗?想知道这是我的网络还是IE和映像的问题。
法布里西奥磨砂

9
今天也是我发现,img.src = ''如果以前使用过,则在分配新的src之前需要webkit 。
quux 2014年

10

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

代码示例:

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

6

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

  1. 使用这篇文章建议的解决方案
  2. 向图像添加一个唯一的后缀,src以强制浏览器再次下载它,如下所示:

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

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


44
这一切都是失败缓存。这是解决此问题的错误方法。正确的方法是Fabricio的答案。只需.onload在设置.src值之前设置处理程序,您就不会错过某些版本的IE中的onload事件。
jfriend00 2012年

1
是的,您是对的,但是缓存并非总是可取的,有时不应该缓存图像。当然,在这种特殊情况下,它取决于需求
haynar 2012年

1
在我的角度应用程序中,我尝试了其他答案说的所有内容,但没有帮助。但是强迫不要像这样的答案说的那样对我有用。所以再加我一个。
Thanu

唯一适用于我的最新版本的Chrome解决方案。
年轻的鲍勃

3

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


对于浏览器已缓存图像,窗口加载正常的情况,这也是一个很好的答案
Shocker

正是我面临的问题。改变$(document).ready$(window).load解决我的问题。
塔里古尔伊斯兰教

0

我发现您可以在Chrome中执行以下操作:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.