防止Safari 5中的后退按钮上的缓存

时间:2011-03-14 10:02:54

标签: safari cache-control

截至最近的safari 5已经发布,结果导致我网站出现问题。我有一个运行经典ASP的动态网站(虽然这应该不重要),并且该网站对历史堆栈有一些创造性的使用。例如,您可以在列出产品的页面上,然后转到有关产品的详细信息并更改产品(admin-view)。单击产品上的“保存”时,信息将通过AJAX发送到服务器,并发出history.back()。这适用于所有浏览器(包括safari< = 4),然而,在新发布的Safari 5中它停止工作。似乎当您在safari 5中单击它实际上并不刷新页面时,它只会从缓存中加载它,这意味着不会显示在详细信息视图中所做的更改。我怎样才能在safari 5中进行这项工作呢?这是我必须关闭缓存的当前代码(包含在每个页面的顶部):

Dim pStr
pStr = "private, no-cache, no-store, must-revalidate"
Response.AddHeader "pragma","no-cache"      '?
Response.AddHeader "cache-control", pStr    '?  Er ikke sikker på om disse 3 siste er nødvendige.
Response.AddHeader "cache-control", "post-check=0, pre-check=0"     '?  Er ikke sikker på om disse 3 siste er nødvendige.
Response.AddHeader "Expires", "Mon, 26 Jul 1997 05:00:00 GMT"       '?
Response.AddHeader "Last-Modified", Now()

3 个答案:

答案 0 :(得分:46)

空的unload处理程序将不再起作用。相反,您可以检查persisted事件的onpageshow属性。初始页面加载时设置为false。从bfcache加载页面时,它设置为true。

Kludgish解决方案是在从bfcache加载页面时强制重新加载。

window.onpageshow = function(event) {
    if (event.persisted) {
        window.location.reload() 
    }
};

如果您使用的是jQuery,请执行以下操作:

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
        window.location.reload() 
    }
});

答案 1 :(得分:7)

经过一些蠢事和挖掘后,我找到了一个解决方案,尽管我对它并不太满意。在body-tag中设置onunload=""会导致Safari无效页面并在window.history.back();之后重新加载。

答案 2 :(得分:3)

这是另一种方式:

    function invalidateBackCache() {
        // necessary for Safari: mobile & desktop
    }

    window.addEventListener("unload", invalidateBackCache, false);

我之所以选择这条路线是因为在.Net的body标签中添加HTML(onunload =“”),包括在我的情况下修改三个文件。在jQuery中设置onunload属性也没有解决它。

这也适用于移动Sarfari(iPad)。