如何使用JavaScript检测我是否在缓存页面上
我想从缓存显示很长一段时间,我想在页面渲染和从缓存加载页面时有一个稍微不同的行为。有没有一种简单的方法可以用JavaScript确定这一点?一种方法是在页面中包含生成页面的时间,然后使用一些JavaScript将本地时间与生成页面的时间进行比较。如果时间相差一个阈值,则该页来自缓存。问题是,如果客户端计算机的时间设置不正确,尽管您可以通过让客户端在生成页面的请求中包含其当前系统时间,然后将该值发送回客户端来解决此问题。不是直接设置的,有些浏览器可能会为其设置一些自定义命令如何使用JavaScript检测我是否在缓存页面上,javascript,Javascript,我想从缓存显示很长一段时间,我想在页面渲染和从缓存加载页面时有一个稍微不同的行为。有没有一种简单的方法可以用JavaScript确定这一点?一种方法是在页面中包含生成页面的时间,然后使用一些JavaScript将本地时间与生成页面的时间进行比较。如果时间相差一个阈值,则该页来自缓存。问题是,如果客户端计算机的时间设置不正确,尽管您可以通过让客户端在生成页面的请求中包含其当前系统时间,然后将该值发送回客户端来解决此问题。不是直接设置的,有些浏览器可能会为其设置一些自定义命令 有一种变通方法可以满足
有一种变通方法可以满足您的需要。使用cookie存储第一次访问的时间戳,然后使用META HTTP-EQUIV设置文件缓存的时间长度(
cacheLength
)。如果当前时间在从timestamp
到timestamp+cacheLength
的时间段内,则将其视为从缓存加载。一旦缓存过期,请重置cookie时间。使用XmlHttpRequest,您可以调出当前页面,然后检查响应的http头
最好的情况是只做一个HEAD请求,然后检查header
关于这样做的一些示例,请看我从上面给出的答案“Daniel”开始,但我担心在缓慢的连接过程中可能会遇到一些延迟问题
这是最终对我有效的解决方案。在服务器端,我添加了一个cookie refCount并将其值设置为0。在javascript中加载文档时,我首先检查refCount,然后增加它。当检查refCount是否大于1时,我知道页面已缓存。因此,这就像一种魅力
感谢大家引导我找到这个解决方案。这个问题已经有4年了。我想我会使用jQuery和插件添加我的2美分
$(文档).ready(函数()
{
$('body')。追加('');
});
bind(窗口,'statechange',函数(){
如果($('.is_cached')。长度>=1)
{
警报(“此页面已缓存”);
}
});
首次加载文档时。追加一个新的div.is\u cached。加载缓存页面时,没有兼容的方式来执行javascript,但您可以监视历史记录的更改。当历史记录更改且div.is_cached存在时,用户将查看缓存页面。使用新的资源计时级别2规范,您可以使用传输大小属性检查页面是否从缓存加载:
var isCached = performance.getEntriesByType("navigation")[0].transferSize === 0;
- 规格:
- 浏览器支持:
- 请注意,在撰写本文时,它显示Safari不支持,而实际上最新版本支持
该死,你赢了我,竖起大拇指!我实际上在考虑这个解决方案。我希望文档中有更简单的内容,但可能它并不存在:)如果您希望它具有任何一致性,那么这不是一个好的答案。在缓慢加载时间、服务器本地时间与客户端本地时间或系统日期不正确的客户端之间,您无法保证该测试的准确性。我正要提出同样的建议,但问题表明,如果您触发XHR,他希望查看当前加载的页面是否缓存,那么这将表示下一个请求,而不是当前请求。谢谢,我不能使用此链接,但是,您发送给我的链接帮助我解决另一个问题。我自己也使用了相同的方法。我在我的博客上写了一个详细的描述:拯救了我的一天!但是我不明白为什么要增加饼干。只需将其设置为“firstLoad=yes”,并在
onLoad
中更改为“firstLoad=no”。从本质上讲,cookie只是一个布尔标志,在页面实际重新加载之前,它会一直保持不变。我应该使用哪些javascript文件来测试这一点?我下载了History插件,但它有很多JS文件…哪一个正在使用这个?我在jQuery中使用了这个,没有任何问题。注意:IF语句应该>=1I我试过了,但什么也没发生,我链接了history js和最新的jqeury js。。。请检查-您缺少标记的脚本类型。在我的例子中,firefox 74 win10的条件应该是pnt.transferSize==0&&pnt.type==='back\u forward'
,否则将重新加载。
var isCached = performance.getEntriesByType("navigation")[0].transferSize === 0;
window.rand = {{ rand() }}
reloadIfCached() {
var cached = localStorage.getItem(window.location.href) == window.rand;
if (cached) {
window.location.reload();
}
localStorage.setItem(window.location.href, window.rand);
}