使用移动野生动物园浏览器时如何防止从缓存中重新加载网页?

How to prevent reloading of web page from cache while using mobile safari browser?

提问人:Bakhshi 提问时间:7/2/2014 最后编辑:CommunityBakhshi 更新时间:11/25/2016 访问量:8644

问:

Mobile Safari 使用一种特殊的缓存机制(此处),它基本上使当前页面保持活动状态,但当我们导航到另一个页面时会休眠。这样,当用户按下按钮时,它可以立即以最新状态显示上一页。Page Cacheback

这对于导航和浏览 Web 很有用,但对于特殊情况,这会变得很烦人,因为每次用户导航到该页面时,您可能需要获取该页面的新副本。(就我而言,我必须页面:登录名和主页)。

我完全知道没有什么可以阻止用户打开同一应用程序的多个选项卡。我对此并不担心。

防止页面被缓存的跨浏览器解决方案无济于事,因为 Safari 使页面保持打开状态,但不可见和暂停。

window.onpageshow 和处理无济于事,因为浏览器似乎由于某些原因第二次(当您按下按钮时)没有执行事件。event.persistedonpageshowback

对于那些不知道事件是什么的人来说,请注意:Apple 不鼓励使用 和 事件,因为使用页面缓存的概念,这些事件没有明确的意义。所以,应该做我们对事件的期望。onpageshowloadunloadonpageshowload

JavaScript iOS 缓存 Safari 页面显示

评论


答:

2赞 Bakhshi 7/2/2014 #1

当用户按下后退按钮时,您将收到与之前相同的文档(已暂停的旧页面)。因此,如果您在导航到新页面之前处理事件并对页面进行一些修改,则您的更改将保留在那里。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 就会加载暂停的页面并执行这个以前未执行过的新脚本块。

评论

0赞 Michael Cordingley 11/24/2014
而不是为什么不干脆做?$body.append("<script type='text/javascript'>window.location.reload();<\/script>");window.location.reload()
0赞 Bakhshi 11/25/2014
井。。。如果你它不起作用。(不工作)如果我没记错的话,Safari 无法正确加载页面或放弃整个重新加载。我们需要在页面暂停后恢复时运行脚本window.location.reload
4赞 Ted Naleid 7/23/2015 #2

另一个可能的解决方案是查看标志以确定它是否被缓存:event.persisted

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