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

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

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

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

用于阻止页面被缓存的跨浏览器解决方案并不能解决问题,因为Safari会将页面保持打开状态,但不可见并被暂停。

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

注意那些不知道onpageshow事件是关于什么的onpageshow :Apple不鼓励使用loadunload事件,因为使用页面缓存的概念,这些事件没有明确的意义。 因此, onpageshow应该做我们期望的load事件。


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

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

当用户按下后退按钮时,您将收到与以前相同的文档(旧页面被暂停)。 因此,如果您处理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>");
        });
    }

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

如果您在离开pagehide回调后推迟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它的作品! 只要用户按下后一页上的按钮,Safari就会加载暂停的页面并执行此前未执行过的这个新的脚本块。

链接地址: http://www.djcxy.com/p/55727.html

上一篇: How to prevent reloading of web page from cache while using mobile safari browser?

下一篇: $("form").submit not working on ipad and iphone