23

截至最近 safari 5 发布,结果证明我的网站出现了一些问题。我有一个运行经典 ASP 的动态网站(尽管这并不重要),并且该网站对历史堆栈进行了一些创造性的使用。例如,您可以在列出产品的页面上,然后转到有关产品的详细信息并更改产品(管理员视图)。当您单击产品上的保存时,信息将通过 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()
4

3 回答 3

45

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() 
    }
});
于 2013-03-19T10:52:05.423 回答
7

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

于 2011-03-14T23:37:30.387 回答
3

这是另一种方式:

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

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

我之所以选择这条路线,是因为在.Net 中将 HTML (onunload="") 添加到 body 标记涉及在我的案例中修改三个文件。在 jQuery 中设置 onunload 属性也没有解决它。

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

于 2011-09-22T16:33:57.947 回答