37

我发现的问题与这个问题非常相似,只是桌面上的 Safari 似乎已经解决了这个问题。本质上,问题是这样的:当客户端在移动 safari 上浏览并且页面在 上执行 javascript 函数pageA.html,然后导航到pageB.html,然后按后退按钮返回到pageA.html时,当客户端按下时,javascript 函数将不会运行返回按钮返回pageA.html。它将跳过 javascript 调用。

我已经尝试了上面链接中提到的解决方案,但似乎对移动 Safari 没有任何作用。有没有其他人遇到过这个错误?你是怎么处理的呢?

4

1 回答 1

94

这是由后向缓存引起的。当用户导航离开时,它应该保存页面的完整状态。当用户使用后退按钮导航返回时,页面可以非常快速地从缓存中加载。这与只缓存 HTML 代码的普通缓存不同。

为 bfcacheonload事件加载页面时不会触发。相反,您可以检查事件的persisted属性onpageshow。它在初始页面加载时设置为 false。从 bfcache 加载页面时,它设置为 true。

window.onpageshow = function(event) {
    if (event.persisted) {
        alert("From back / forward cache.");
    }
};

由于某种原因,jQuery 在事件中没有这个属性。您可以从原始事件中找到它。

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
      alert("From back / forward cache.");
    }
});

这些问题的快速解决方案是在按下后退按钮时重新加载页面。然而,这抵消了后向/前向缓存会产生的任何积极影响。

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

作为旁注,您可以看到许多使用空onunload处理程序作为解决方案的页面。自 iOS5 以来,这一直不起作用。

$(window).bind("unload", function() { });
于 2012-09-29T11:04:26.860 回答