2011-04-19 364 views
103

我想使用JavaScript重新加载页面,但我也想清除缓存,所以在页面刷新页面上有最新版本的服务器。
除IE之外的其他浏览器没有获取最新内容。window.location.reload清除缓存

IE9的任何解决方案?

+5

当用户坐在代理后面时,可能会发生丑陋的事情。为了确保页面重新加载,只需将随机的val添加到您的网址。 – Teson 2011-04-19 21:15:15

回答

160

reload()应该接受它告诉它做一个硬性重新加载,即一个说法,忽略缓存:

location.reload(true); 

我不能保证它的可靠性,您可能需要进一步调查。

+0

它是否适用于android webkit浏览器? – prongs 2012-03-29 07:44:54

+0

@prongs我不明白为什么它不应该。当然,我没有基于Android的webkit来测试它... – Christian 2012-03-29 14:40:16

+16

适用于IE和FF,但不适用于Chrome,Safari。任何人都知道如何在Chrome,Safari中实现这一点? – testpattern 2012-10-30 13:31:00

40

您可以通过几种方法来做到这一点。一,单纯这个元标记添加到您的head

<meta http-equiv="Cache-control" content="no-cache"> 

如果你想使一个已经缓存获取的也抹去了expires元标记应努力通过像这样将它设置为-1删除它肯定的东西:

<meta http-equiv="Expires" content="-1"> 

http://www.metatags.org/meta_http_equiv_cache_control

此外,IE应该给你的主网页的最新内容。如果您遇到外部文档问题,例如CSS和JS,请在URL的末尾添加一个虚拟参数,并使用当前时间(以毫秒为单位),以使其不变。这样,IE和其他浏览器将始终为您提供最新版本。这里有一个例子:

<script src="mysite.com/js/myscript.js?12345"> 

--UPDATE--

阅读我知道你想以编程方式清除缓存,而不是每次的意见后。你可以做的是有一个函数在JS想:

eraseCache(){ 
    window.location = window.location.href+'?eraseCache=true'; 
} 

然后,在PHP让我们说,你做这样的事情:

<head> 
<?php 
    $cache = ''; 
    if(isset($_GET['eraseCache'])){ 
    echo '<meta http-equiv="Cache-control" content="no-cache">'; 
    echo '<meta http-equiv="Expires" content="-1">'; 
    $cache = '?'.time(); 
    } 
?> 
<!-- ... other head HTML --> 
<script src="mysite.com/js/script.js<?= $cache ?>" 
</head> 

这不是测试,但应该工作。基本上,你的JS函数,如果被调用,将重新加载页面,但在URL的末尾添加一个GET参数。然后你的网站会有一些后端代码来寻找这个参数。如果它存在,它会添加元标记和包含时间戳的缓存var,并将其附加到您正在缓存问题的脚本和CSS。

--update 2--

meta标记确实不会清除缓存的负载。因此,从技术上讲,您需要在JS中运行eraseCache函数,一旦页面加载,您需要重新加载它以便进行更改。你应该能够用你的服务器端语言来解决这个问题。你可以运行相同的eraseCache JS的命令,但不是添加meta标签在你的页面的顶部运行此相反:

<?php 
    header("Cache-Control: no-cache, must-revalidate"); 
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
?> 
<!-- Here you'd start your page... --> 

这样的工作,因为它之前删除缓存页面加载和任何运行之前。

+3

如果我错了,纠正我,但meta缓存控制标记将阻止正在加载的页面的缓存。它不会清除已保存在客户端浏览器中的缓存。 – Keylan 2011-04-19 20:34:04

+2

此外,将时间以毫秒为单位添加到src属性的末尾永远不会允许该JavaScript文件被缓存......这是不可取的。我从coure06希望能够通过请求清除浏览器缓存的问题中获得它 - 而不是永久保证该文件永远不会被缓存。也许一个综合的解决方案是使用包含的GET参数来链接到同一页面,这会强制javascript包含当前时间。 – Keylan 2011-04-19 20:38:57

+1

只是想继续添加评论,因为我认为新的东西显然。将毫秒添加到基于某些事件的文件路径上并不容易,因为在完成一次之后 - 文件路径永远不会仅返回到myscript.js,因为浏览器只会切换回缓存文件。 – Keylan 2011-04-19 20:44:31

4

我写了这个JavaScript脚本,并将其包含在标题(在任何加载之前)。它似乎工作。如果页面在一个多小时前加载,或者情况未定义,它将重新加载服务器上的所有内容。 一小时= 3600000毫秒的时间可以在下面的行来改变: 如果(改变> 3600000)

与问候, Birke酒店

<script type="text/javascript"> 
//<![CDATA[ 
function zeit() 
{ 
    if(document.cookie) 
    { 
     a = document.cookie; 
     cookiewert = ""; 
     while(a.length > 0) 
     { 
      cookiename = a.substring(0,a.indexOf('=')); 
      if(cookiename == "zeitstempel") 
      { 
       cookiewert = a.substring(a.indexOf('=')+1,a.indexOf(';')); 
       break; 
      } 
      a = a.substring(a.indexOf(cookiewert)+cookiewert.length+1,a.length); 
     } 
     if(cookiewert.length > 0) 
     { 
      alter = new Date().getTime() - cookiewert; 

      if(alter > 3600000) 
      { 
       document.cookie = "zeitstempel=" + new Date().getTime() + ";"; 
       location.reload(true); 
      } 
      else 
      { 
       return; 
      } 
     } 
     else 
     { 
      document.cookie = "zeitstempel=" + new Date().getTime() + ";"; 
      location.reload(true); 
     } 
    } 
    else 
    { 
     document.cookie = "zeitstempel=" + new Date().getTime() + ";"; 
     location.reload(true); 
    } 
} 
zeit(); 
//]]> 
</script> 
2

在我的情况重载()不工作因为asp.net控制行为。所以,为了解决这个问题,我已经使用了这种方法,尽管似乎是一个解决方法。

self.clear = function() { 
    //location.reload(true); Doesn't work to IE neither Firefox; 
    //also, hash tags must be removed or no postback will occur. 
    window.location.href = window.location.href.replace(/#.*$/, ''); 
}; 
6

我有这个问题,我解决它使用JavaScript

location.reload(true); 

你也可以使用

window.history.forward(1); 

阻止用户登录后浏览器后退按钮退出应用程序。

+0

这个'location.reload(true);'会放在javascripts文件中? – FedericoCapaldo 2017-05-21 16:04:28

+0

是的,你可以把它放在任何js文件中 – yousef 2017-05-22 13:00:46

+0

@FedericoCapaldo只要将它放在你想要重载用户页面时调用的任何函数中 – 2017-06-27 17:44:30

4

Cache.delete()也可以用来清除最新的chrome,firefox和opera浏览器的缓存。