如何防止使用移动Safari浏览器从caching中重新加载网页?

移动Safari使用一个特殊的caching机制Page Cache ( 这里 )基本上保持当前页面活着,但hibernate时,我们导航到另一个页面。 这样,当用户按下backbutton时,它可以立即显示在其最新状态的前一页。

这对于导航和浏览网页很有用,但是对于特殊情况,这会变得令人讨厌,因为每次用户导航到该页面时都需要获取新的页面副本。 (在我的情况下,我必须页面:login和主页)。

我完全知道,没有什么阻止用户打开同一个应用程序的多个选项卡。 我不关心这一点。

用于阻止页面被caching的跨浏览器解决scheme并不能帮助Safari正在保持页面打开,但是不可见和暂停。

window.onpageshow和处理event.persisted没有帮助,因为似乎浏览器由于某些原因第二次(当你按backbutton)不执行onpageshow事件。

请注意,对于那些不知道什么onpageshow事件是关于:苹果不鼓励使用loadunload事件,因为与页面caching的概念这些事件没有明确的意义。 所以, onpageshow应该做我们期望的load事件。

另一个可能的解决scheme是查看event.persisted标志来确定它是否被caching:

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

当用户按下后退button时,您将收到与以前相同的文档(旧页面被暂停)。 所以如果你处理onpagehide事件,并在导航到新页面之前对页面进行一些修改,那么你的修改就保存在这里。

我试图在导航之前添加一个脚本块

 if (isSafari) { window.addEventListener('pagehide', function(e) { var $body = $(document.body); $body.children().remove(); $body.append("<script type='text/javascript'>window.location.reload();<\/script>"); }); } 

这不起作用,因为当用户返回到页面时,脚本立即执行我的意图执行的地方。

但是如果你在离开pagehidecallback之后推迟你的DOM修改,(如下所示):

 if (isSafari) { window.addEventListener('pagehide', function(e) { var $body = $(document.body); $body.children().remove(); // wait for this callback to finish executing and then... setTimeout(function() { $body.append("<script type='text/javascript'>window.location.reload();<\/script>"); }); }); } 

TADA它的工作原理! 只要用户按下后一页上的button,Safari就加载暂停的页面,并执行这个以前没有执行过的新的脚本块。