2011-03-14 57 views
23

由于最近Safari 5发布了,它导致我的网站出现一些问题。我有一个运行传统ASP的动态网站(尽管这应该不重要),并且该网站有一些创造性的历史堆栈使用。例如,您可以在列出产品的页面上,然后查看有关产品的详细信息并更改产品(admin-view)。当您点击产品上的保存时,信息将通过AJAX发送到服务器,并发出history.back()。这在所有浏览器(包括safari < = 4)都很好,但是,在新发布的safari 5中,它停止工作。看起来,当您在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() 

回答

45

空的unload处理程序将不再工作。相反,您可以检查onpageshow事件的persisted属性。它在初始页面加载时设置为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

伟大的修复 - 确认从iOS 6(iPhone和iPad)开始工作!谢谢Mika! – Jesse 2013-04-07 12:15:36

+2

这也适用于Safari 6,桌面。 window.onunload的旧黑客不再一贯地工作 - 现在应该被认为是“正确的”答案。 – 2013-06-06 20:34:06

+1

这适用于iPad。不幸的是(至少对我而言),当它从睡眠模式唤醒时,它有重新加载页面的副作用。如果用户做了一堆表单元素的更改导致各种显示更改,用户必须重新开始。有没有办法重新加载页面只有从后退按钮,但不是如果醒来? – 2013-10-16 20:37:14

7

一些googeling后挖我已经找到了解决方案,但我不是太高兴。在body-tag中设置onunload=""会导致Safari无效并重新加载页面window.history.back();

+1

我一直有一个类似的问题,但我希望用户在浏览器的背部进行重新验证(学生在iPad上轮流) 。 onunload =“”hack似乎很好地在笔记本电脑上强制重新验证Safari,但不在iPad上的移动Safari上。有什么想法吗? – John 2011-08-09 04:29:17

3

这里的另一种方式:

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

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

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

这也适用于手机Sarfari(iPad)。

+2

nope,这也不适用于我(后退按钮在ipad上)。它只是在刷新。 – sirmak 2012-02-14 07:14:54

+1

这个想法是正确的/为我工作。我使用了下面的jquery相关代码:'$(window).on('unload',function(){});' – Sam 2014-04-15 23:25:21

+0

请注意,在移动版Safari上最近的版本报告卸载事件有问题,因此您可能想要仔细检查 – 2016-11-14 21:32:32