Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaScript检测我是否在缓存页面上_Javascript - Fatal编程技术网

如何使用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不支持,而实际上最新版本支持
  • 在创建时向服务器上的页面添加唯一数据。例如,随机数或创建时间:
  • 使用本地存储将url与号码一起保存,并在以后需要时进行比较:

  • 该死,你赢了我,竖起大拇指!我实际上在考虑这个解决方案。我希望文档中有更简单的内容,但可能它并不存在:)如果您希望它具有任何一致性,那么这不是一个好的答案。在缓慢加载时间、服务器本地时间与客户端本地时间或系统日期不正确的客户端之间,您无法保证该测试的准确性。我正要提出同样的建议,但问题表明,如果您触发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);
           }