提问人:Bakhshi 提问时间:7/2/2014 最后编辑:CommunityBakhshi 更新时间:11/25/2016 访问量:8644
使用移动野生动物园浏览器时如何防止从缓存中重新加载网页?
How to prevent reloading of web page from cache while using mobile safari browser?
问:
Mobile Safari 使用一种特殊的缓存机制(此处),它基本上使当前页面保持活动状态,但当我们导航到另一个页面时会休眠。这样,当用户按下按钮时,它可以立即以最新状态显示上一页。Page Cache
back
这对于导航和浏览 Web 很有用,但对于特殊情况,这会变得很烦人,因为每次用户导航到该页面时,您可能需要获取该页面的新副本。(就我而言,我必须页面:登录名和主页)。
我完全知道没有什么可以阻止用户打开同一应用程序的多个选项卡。我对此并不担心。
防止页面被缓存的跨浏览器解决方案无济于事,因为 Safari 使页面保持打开状态,但不可见和暂停。
window.onpageshow 和处理无济于事,因为浏览器似乎由于某些原因第二次(当您按下按钮时)没有执行事件。event.persisted
onpageshow
back
对于那些不知道事件是什么的人来说,请注意:Apple 不鼓励使用 和 事件,因为使用页面缓存的概念,这些事件没有明确的意义。所以,应该做我们对事件的期望。onpageshow
load
unload
onpageshow
load
答:
当用户按下后退按钮时,您将收到与之前相同的文档(已暂停的旧页面)。因此,如果您在导航到新页面之前处理事件并对页面进行一些修改,则您的更改将保留在那里。onpagehide
我尝试在导航之前添加一个脚本块:body
if (isSafari) {
window.addEventListener('pagehide', function(e) {
var $body = $(document.body);
$body.children().remove();
$body.append("<script type='text/javascript'>window.location.reload();<\/script>");
});
}
这是行不通的,因为当用户返回页面时,脚本会立即在我打算执行的地方执行。
但是,如果您在离开回调后推迟 DOM 修改,(如下所示):pagehide
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有效!一旦用户按下下一页上的后退按钮,Safari 就会加载暂停的页面并执行这个以前未执行过的新脚本块。
评论
$body.append("<script type='text/javascript'>window.location.reload();<\/script>");
window.location.reload()
window.location.reload
另一个可能的解决方案是查看标志以确定它是否被缓存:event.persisted
window.onpageshow = function(event) {
if (event.persisted) {
window.location.reload()
}
};
评论