1

我正在创建一个 javascript 图像循环(用于天气雷达站点),并且我正在使用以下循环在页面加载时预取所有 10 个图像:

Radar_Images = new Array();
var now = new Date();
for (var i = 0; i <= 9; i++){
     Radar_Images[i] = new Image();
     Radar_Images[i].src = "radar_" + i + ".jpg?" + now.getTime();
}

我正在添加“?” + 现在.getTime(); 为了确保浏览器在加载页面时拉取新副本,并且正常工作。下载了 10 个新图像,并且数组正确加载了:

[0] = images/radar_0.jpg?12345 (12345 只是举例......它实际上是一个 13 位数字)

[1] = 图像/radar_1.jpg?12345

[2] = 图像/radar_2.jpg?12345

等等

现在,当我播放 javascript 动画时,循环遍历数组,它可以流畅地播放每个缓存的图像。

我有一个定期轮询,使用 XMLHttpRequest 检查radar_0.jpg 标头中的“Last-Modified”标记(radar_0.jpg 始终是最新的图像)。如果检测到新的时间戳,它会跳转到下载新图像的函数:

var now = new Date();
Radar_Images[9].src = Radar_Images[8].src;
Radar_Images[8].src = Radar_Images[7].src;
Radar_Images[7].src = Radar_Images[6].src;
Radar_Images[6].src = Radar_Images[5].src;
Radar_Images[5].src = Radar_Images[4].src;
Radar_Images[4].src = Radar_Images[3].src;
Radar_Images[3].src = Radar_Images[2].src;
Radar_Images[2].src = Radar_Images[1].src;
Radar_Images[1].src = Radar_Images[0].src;
Radar_Images[0].src = "images/radar_0.jpg?" + now.getTime();

这样做的目的是将图像向下移动一个档次,丢弃最旧的图像,并将更新的 radar_0.jpg 图像下载到 [0] 插槽中。这样,我不必再次重新下载所有 10 张图像,因为其中只有一张发生了变化。它按预期工作,这是更新后的数组:

[0] = images/radar_0.jpg?67890 <- 注意 now.getTime() 中新的、唯一的标签

[1] = images/radar_0.jpg?12345 <- 这曾经在位置 0...

[2] = images/radar_1.jpg?12345 <- 这曾经在位置 1...

等等

这就是问题出现的地方。

当我现在循环浏览图像时,Images[0] 和 Images[1] 都显示最新下载的图像。Image[1],即使它仍然指向较旧的缓存图像,也会丢失。好像浏览器忘记了.jpg之后的所有内容?并将它们识别为相同的图像,radar_0.jpg,即使 ?12345 与 ?67890 不同。

我想知道的是,有什么方法可以强制浏览器尊重 .jpg?12345 和 .jpg?67890,并显示独特的图像(因为它们应该被缓存为唯一的),即使它们都是radar_0 .jpg

非常感谢!

更新:

因此,经过进一步调查,似乎没有任何图像被缓存,尽管它们似乎在 javascript 循环期间被很好地缓存。循环播放的速度肯定足够快,以至于它们并非全部连续下载。但是当发生转变时,图像(其中只有 9 个)似乎正在重新下载。换句话说:

[0] = images/radar_0.jpg?67890 <- 这会加载新的 radar_0.jpg 文件(正确)

[1] = images/radar_0.jpg?12345 <- 这也会加载新的radar_0.jpg 文件(不正确)

[2] = images/radar_1.jpg?12345 <- 现在加载之前的radar_0.jpg文件,现在在服务器上重命名为radar_1.jpg

[3] = images/radar_2.jpg?12345 <- 现在加载之前的radar_1.jpg文件,现在在服务器上重命名为radar_2.jpg

...

[9] = 图像/radar_8.jpg?12345

注意,现在没有任何东西指向images/radar_9.jpg?12345,所以重命名的radar_9.jpg(以前是radar_8.jpg)没有下载,这就是为什么我说只重新下载9张图片,而不是全部10.

如果我让页面保持足够长的时间,数组最终会被移出,所有指针都指向 images/radar_0.jpg?... 之后是什么?都是不同的。然而,没有什么可以“循环”了,因为它们都是相同的图像——radar_0.jpg。

因此,似乎缓存被完全忽略了,尽管我不确定它为什么适用于循环本身。

我的 HTML 标头设置如下:

<META HTTP-EQUIV="Cache-Control" CONTENT="public">

非常感谢任何帮助。

4

0 回答 0