image.onload 事件和浏览器缓存

IT技术 javascript image-loading
2021-01-12 08:34:47

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

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

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

当您动态生成图像时,请onloadsrc.

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

小提琴

好的,感谢提醒,更新了答案以反映您的推理=]另外@jfriend00 你能检查一下图片是否在 IE 中加载吗?想知道这是我的网络问题还是 IE 和图像的问题。
2021-03-13 08:34:47
.complete在这种情况下没有理由依赖只需在设置之前先设置您的负载处理程序.src,就不需要它了。我写了一个幻灯片,在每个可以想象的浏览器中都有数千个站点使用,第一种技术每次都有效。没有必要.complete像这样从头开始创建新图像。
2021-03-14 08:34:47
等待。为什么您的第二个代码示例会.src在设置 .onload 之前做错事并进行设置?在第一个代码示例中您说对了,但在第二个示例中搞砸了。第二个在某些版本的 IE 中无法正常工作。
2021-03-30 08:34:47
@jfriend00 不,不是一团糟。备份代码(第二个)完全适用于第一个代码以某种方式停止工作的情况。如果图像已被缓存,=]它会使用.complete检查,因此代码正在演示它。当然,为了最佳实践,您始终可以设置srcafter all handlers 绑定。
2021-04-06 08:34:47
今天我发现 webkit 需要img.src = ''在分配新的 src 之前,如果它之前使用过。
2021-04-11 08:34:47

如果 src 已经设置,那么在你绑定事件处理程序之前,事件就会在缓存的情况下触发。因此,您也应该基于 off 触发事件.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 的末尾时,您都会使其唯一,浏览器将再次下载图像

在我的 angular 应用程序中,我尝试了其他答案所说的所有内容,但没有帮助。但是强制不缓存像这个答案说的对我有用。所以加我一个。
2021-03-12 08:34:47
在最新版本的 Chrome 中对我有用的唯一解决方案。
2021-03-12 08:34:47
是的,你是对的,但并不总是需要缓存,有时图像不应该被缓存。当然,在这种特殊情况下,这取决于需求
2021-03-16 08:34:47
所有这些都是打败缓存。这是解决这个问题的错误方法。正确的方法是在法布里西奥的答案中。只需.onload在设置.src之前设置处理程序,您就不会错过某些版本的 IE 中的 onload 事件。
2021-03-24 08:34:47

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

对于浏览器缓存了图像的情况,这也是一个很好的答案,在窗口加载时工作正常
2021-04-05 08:34:47
正是我面临的问题。改变$(document).ready$(window).load解决我的问题。
2021-04-10 08:34:47

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

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

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