用透明缓存重新加载

我想重新加载一个页面使用 JavaScript,但我想清除缓存也,所以在页面刷新页面有最新版本的一切从服务器。
除了 IE,其他浏览器都没有得到最新的内容。

IE9有什么解决方案吗?

424194 次浏览

你可以通过以下几种方式来实现: 第一,简单地将这个 meta 标签添加到你的 head:

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

如果要从缓存中删除文档,expires元标记应该通过将其 content属性设置为 -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">

更新1

在阅读了注释之后,我意识到您希望以编程方式擦除缓存,而不是每次都这样做。你可以在 JS 中使用这样的函数:

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

然后,在 PHP 中,我们可以这样做:

<head>
<?php
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 参数。然后,您的站点将有一些后端代码来查找这个参数。如果存在,它将添加 meta 标记和包含时间戳的缓存变量,并将其附加到存在缓存问题的脚本和 CSS。

更新2

Meta 标记确实不会擦除缓存 在页面加载上。因此,从技术上讲,您需要在 JS 中运行 eraseCache 函数,一旦页面加载,您将需要加载它 再来一次以发生更改。您应该能够用服务器端语言修复这个问题。您可以运行相同的 擦除缓存 JS 函数,但是您需要添加 HTTP 缓存头,而不是添加 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... -->

此方法不需要重新加载页面即可立即工作,因为它在加载页面之前以及运行任何内容之前都会擦除缓存。

reload()应该接受一个参数,该参数告诉它执行硬重载,即忽略缓存:

location.reload(true);

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


编辑(2021) : 该参数从未被标准化,并且在更现代的浏览器中已被弃用和删除。每个季度添加一个评论来描述这个事实是没有帮助的。

我编写了这个 javascript 脚本,并将其包含在头文件中(在任何加载之前)。看起来有用。如果页面加载超过一个小时前或情况是未定义的,它将从服务器重新加载一切。 1小时 = 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>

在我的例子中,reload ()不起作用,因为 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(/#.*$/, '');
};

我遇到了这个问题,我用 javascript 解决了它

 location.reload(true);

你亦可使用

window.history.forward(1);

在用户退出应用程序后停止浏览器返回按钮。