防止Safari 5中的“返回缓存”按钮

防止Safari 5中的“返回缓存”按钮,safari,cache-control,Safari,Cache Control,最近发布了safari 5,结果给我的网站带来了一些问题。我有一个运行经典ASP的动态网站(虽然这不重要),该网站创造性地使用了历史堆栈。例如,您可以在列出产品的页面上,然后转到有关产品的详细信息并更改产品(管理视图)。当您单击产品上的保存时,信息通过AJAX发送到服务器,并发出history.back()。这在所有浏览器中都非常有效(包括safari),经过谷歌搜索和挖掘,我找到了一个解决方案,尽管我对此不太满意。在body标记中设置onunload=“”,safari会使页面无效并重新加载到

最近发布了safari 5,结果给我的网站带来了一些问题。我有一个运行经典ASP的动态网站(虽然这不重要),该网站创造性地使用了历史堆栈。例如,您可以在列出产品的页面上,然后转到有关产品的详细信息并更改产品(管理视图)。当您单击产品上的保存时,信息通过AJAX发送到服务器,并发出
history.back()
。这在所有浏览器中都非常有效(包括safari),经过谷歌搜索和挖掘,我找到了一个解决方案,尽管我对此不太满意。在body标记中设置
onunload=“”
,safari会使页面无效并重新加载到
window.history.back();

以下是另一种方法:

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

    window.addEventListener("unload", invalidateBackCache, false);
我之所以选择这样做,是因为在.Net中向body标记添加HTML(onunload=“”)需要修改三个文件。在jQuery中设置onunload属性也不能解决这个问题


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

空的
卸载处理程序将不再工作。相反,您可以检查
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() 
    }
});

我也遇到过类似的问题,除了我希望在浏览器背面重新验证用户(学生轮流使用iPad)。onunload=”“黑客似乎可以在笔记本电脑上的Safari上重新验证,但在iPad上的mobile Safari上没有。有什么想法吗?没有,这对我也不起作用(iPad上的后退按钮)。它只对刷新有效。这个想法对我来说是正确的/有效的。我使用了以下依赖于jquery的代码:
$(窗口)。on('unload',function(){});
注意,据报告,在最新版本的mobile Safari上,卸载事件有问题,因此您可能需要再次检查伟大的修复程序-确认从iOS 6起工作(iPhone和iPad)!谢谢Mika!这也适用于Safari 6,桌面。window.onunload的老方法不再适用了。这应该被认为是“正确”的答案。这在iPad上适用。不幸的是(至少对我来说),它的副作用是在从睡眠模式醒来时重新加载页面。如果用户对表单元素进行了大量更改,导致各种显示更改,则用户必须重新开始。是否有方法仅在从“上一步”按钮重新加载页面,而不是在唤醒时重新加载页面?您可以将表单的状态保存到本地存储中我们有现成的插件:jQuery版本中有一个小错误。在最后一个分号之前缺少a)。
$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
        window.location.reload() 
    }
});