使用Javascript刷新图像,但仅当在服务器上更改时

使用Javascript刷新图像,但仅当在服务器上更改时,javascript,http,http-headers,if-modified-since,Javascript,Http,Http Headers,If Modified Since,如果页面上的图像已在服务器上更新,我希望在页面上重新加载该图像。在这方面,有人建议做一些类似的事情 newImage.src = "http://localhost/image.jpg?" + new Date().getTime(); 强制重新加载图像,但这意味着即使它确实没有更改,也会再次下载 是否有任何Javascript代码会导致使用适当的生成对同一图像的新请求(如果自头修改),以便仅在图像实际发生更改时才下载该图像 更新:我仍然很困惑:如果我只是请求典型的URL,我会得到本地缓存的副

如果页面上的图像已在服务器上更新,我希望在页面上重新加载该图像。在这方面,有人建议做一些类似的事情

newImage.src = "http://localhost/image.jpg?" + new Date().getTime();
强制重新加载图像,但这意味着即使它确实没有更改,也会再次下载

是否有任何Javascript代码会导致使用适当的
生成对同一图像的新请求(如果自
头修改),以便仅在图像实际发生更改时才下载该图像


更新:我仍然很困惑:如果我只是请求典型的URL,我会得到本地缓存的副本。(除非我让服务器将其标记为不可缓存,但我不想这样做,因为整个想法是不重新下载它,除非它真的发生更改。)如果我更改URL,我将始终重新下载,因为新URL的目的是破坏缓存。那么,如何获得我想要的中间行为,即仅在文件与本地缓存副本不匹配时下载文件?

Javascript无法侦听服务器上的事件。相反,您可以采用某种形式的长轮询,或对服务器进行顺序调用,以查看映像是否已更改。

您应该看看该方法。它是任何XMLHttpRequest对象的方法,可用于设置Ajax查询的标题。在jQuery中,您可以轻松地向ajax对象添加
beforeSend
属性,并在其中设置一些头


也就是说,使用Ajax进行缓存可能很棘手。你可能想看看Google群组,因为试图覆盖浏览器的缓存机制涉及到一些问题。您需要确保您的服务器返回正确的缓存控制标头,才能使类似的内容正常工作。

如果服务器配置正确(即支持Etag/Last Modified),客户端/代理/缓存层应符合服务器发送的内容。不确定此注释的含义--您是说,如果服务器配置正确,如果我只是将src重新设置为原始图像URL,并且不在末尾添加额外的假时间戳,则图像应刷新?如果服务器配置正确,然后,当客户端请求具有“If Modified-Since”头的资源时,服务器将以“304”状态代码响应。换句话说,客户机使用“If Modified Since”头询问是不够的,服务器也必须打球。对,但是如何让客户机使用If Modified Since头生成请求?如果我更改URL,客户端会认为这是一个新文件,因此不会添加标题,但如果我不更改URL,则无法要求页面对图像进行软刷新,至少我不知道有一个是这样的……通常情况下,您不会这样做:如果服务器发送了“Etag/Last Modified”标题,然后,客户端将在对服务器的后续调用中利用该信息。这就是我所说的“两人必须合作”。当然,您总是可以使用这个头信息编写Ajax XmlHttpRequests,并亲自查看。但我不确定这是否值得,我知道我需要投票;基本上,我想要的是轮询图像是否已更改的最简单方法,即发送一个http请求,该请求说“如果该图像自我更改后已被修改,请下载该图像”,因此问题是我可以使用什么Javascript生成该请求。