2012-08-16 116 views
34

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

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

+2

如果还没有出现,您可能会尝试在所有链接网址后添加'?'。例如:'href =“next.html”'变成'href =“next.html?”'。这会给Web浏览器提示页面内容是动态的,并再次进入该页面应该再次从服务器重新加载页面。这也应该应用于外部脚本。例如:'src =“mylib.js”'变成'src =“mylib.js?”'。 – Jay 2012-09-18 06:52:22

回答

86

这是由back-forward cache造成的。它应该在用户导航时保存页面的完整状态。当用户使用后退按钮浏览页面时,可以非常快速地从缓存加载。这与仅缓存HTML代码的普通缓存不同。

当页面加载bfcache onload事件不会被触发。相反,您可以检查onpageshow事件的persisted属性。它在初始页面加载时设置为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() { }); 
+3

应该指出的是,这个解决方案不再适用于当前版本的iOS(我相信我读过的地方是任何超出5ish的地方)。 pageshow事件将触发第一个后退/前进,并且不再为该页面历史状态启动。 我发现超越的唯一可行的解​​决方案是利用popstate事件来识别后退/前进。 – Shiboe 2014-05-29 17:41:38

+1

这是自iOS5以来一直没有工作的空onunload处理程序。上面的答案适用于iOS6。虽然不知道iOS7。稍后再测试一下。 – 2014-05-30 08:38:51

+0

这适用于iOS7,但如果关闭屏幕并再次打开屏幕,还具有刷新页面的副作用。任何方式来解决这个问题? – Dave4988 2014-09-08 15:18:19