我正在创建一个 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">
非常感谢任何帮助。