如何清除或替换缓存的图像

36 javascript caching replace image

我知道有很多方法可以防止图像缓存(例如通过META标签),以及一些很好的技巧来确保每个页面加载时显示当前版本的图像(例如image.jpg?x = timestamp ),有没有办法在浏览器缓存中实际清除或替换图像,以便上述两种方法都不是必需的?

例如,假设页面上有100个图像,这些图像被命名为"01.jpg","02.jpg","03.jpg"等.如果图像"42.jpg"被替换,则是有没有办法在缓存中替换它,以便"42.jpg"将在连续页面加载时自动显示新图像?我不能使用META标记方法,因为我需要永久性地将ISN"T替换为保持缓存,并且我不能使用timestamp方法,因为我不希望每次页面都重新加载所有图像负载.

我绞尽脑汁在互联网上寻找一种方法(最好是通过javascript),但没有运气.有什么建议?

Gre*_*reg 51

If you're writing the page dynamically, you can add the last-modified timestamp to the URL:

<img src="image.jpg?lastmod=12345678" ...

  • 这是我觉得最好的答案,因为它仍然允许浏览器缓存。 (2认同)
  • 怎么样`<img rel="nofollow noreferrer" src ="image.jpg?<?php echo filemtime('image.jpg')?>"`,当然更有活力! (2认同)

Kor*_*nel 13

<meta>绝对无关紧要.实际上,您根本不应该尝试使用它来控制缓存(当任何内容读取文档的内容时,它已经被缓存).

在HTTP中,每个URL都是独立的.无论您对HTML文档执行什么操作,它都不适用于图像.

要控制缓存,您可以在每次内容更改时更改URL.如果您不时更新图像,请允许它们永久缓存并为新图像使用新文件名(带有版本,哈希或日期) - 这是长期文件的最佳解决方案.

如果您的图像经常变化(每隔几分钟,甚至每次请求),则发送Cache-control: no-cacheCache-control: max-age=xx其中xx是图像"新鲜"的秒数.

短期文件的随机URL是个坏主意.它会使用无用的文件污染缓存,并强制更快地清除有用的文件.

如果你有Apache和/ mod_headersmod_expires然后.htaccess用适当的规则创建文件.

<Files ~ "-nocache\.jpg">
   Header set Cache-control "no-cache"
</Files>
Run Code Online (Sandbox Code Playgroud)

以上将使*-nocache.jpg文件不可缓存.

您还可以通过PHP脚本提供图像(默认情况下它们具有可靠的可配置性;)


小智 10

像这样添加图片网址

"image1.jpg?" + DateTime.Now.ToString("ddMMyyyyhhmmsstt");

只需在查询字符串中添加随机字符串即可

谢谢

Raju Jetla

  • 这实际上并不刷新图像缓存.它只是诱使浏览器思考它的新形象.使用此方法,如果我检查chrome缓存,我可以看到12+相同的图像.在服务器上设置Cache-Control对我的响应是一个更好的解决方案,而不是黑客攻击.理想情况下,您确实希望浏览器缓存图像,只需在更改时刷新它. (5认同)

Doi*_*oin 10

相反的是一些其他的答案说,有IS用于客户端的方式JavaScript来替换缓存图像.诀窍是创建一个隐藏<iframe>,将其src属性设置为图像URL,等待它加载,然后通过调用强制重新加载它location.reload(true).这将更新图像的缓存副本.然后,您可以替换<img>页面上的元素(或重新加载页面)以查看图像的更新版本.

(小警告:如果更新单个<img>元素,并且如果有多个图像已更新,则必须清除或删除它们全部,然后替换或重置它们.如果您逐个执行此操作,某些浏览器会从其他标签复制图像的内存版本,结果是您可能看不到更新的图像,尽管它位于缓存中).

我在这里发布了一些代码来进行这种更新.


str*_*ger 5

我敢肯定大多数浏览器都遵循Last-Modified HTTP标头.发送出去并请求新图片.如果Last-Modified行没有更改,它将由浏览器缓存.


abh*_*itk 5

您可以在图像上附加一个随机数,就像给它一个新版本一样。我已经实现了类似的逻辑,并且运行良好。

<script>
var num = Math.random();
var imgSrc= "image.png?v="+num;
$(function() {
$('#imgID').attr("src", imgSrc);
})
</script>
Run Code Online (Sandbox Code Playgroud)


Tra*_*isO 2

使用 ?x=timestamp 技巧的原因是因为这是在每个图像的基础上执行此操作的唯一方法。或者动态生成图像名称并指向输出图像的应用程序。

我建议您在服务器端弄清楚图像是否已更改/更新,如果是,则使用 ?x=timestamp 技巧输出标记以强制使用新图像。