在移动 Safari 中按下后退按钮后,Javascript 停止在 iframe 中执行
Posted
技术标签:
【中文标题】在移动 Safari 中按下后退按钮后,Javascript 停止在 iframe 中执行【英文标题】:Javascript stops executing in iframe after back button is pressed in mobile safari 【发布时间】:2012-02-01 10:39:32 【问题描述】:我有一个适用于手机的网页,其中包含一个 iframe,其中包含在父目标中打开的链接。
在 ios 5.0.1 上的 Safari 中,当用户单击链接,然后使用后退按钮返回页面时,javascript 停止在 iframe 内执行。
一个简单的演示来说明问题:
单击链接,确认警报并使用返回按钮。第二次单击该链接时,警报将不会显示。
index.html:
<html>
<body>
<iframe src="iframe.html"></iframe>
</body>
</html>
iframe.html:
<html>
<body>
<a target="_parent" onclick="alert('Click')" href="http://www.google.com">
Link
</a>
</body>
</html>
我想不出可能是什么原因造成的。有人遇到过这个吗?
【问题讨论】:
【参考方案1】:我遇到了同样的问题。似乎 iPad 的 Safari 对页面进行了快照,当您使用后退按钮返回该页面时,它会加载该快照并且 javascript 代码没有被执行。
好像和这个问题有关: http://www.mac-forums.com/forums/internet-networking-wireless/257631-safari-ipad-back-button-generates-old-info.html
非常烦人。我还没有找到解决办法。
【讨论】:
【参考方案2】:这是一个 Webkit 错误:Location and other objects are dysfunctional after a document gets restored from [back/forward] cache
Adding an empty unload
handler seems to avoid the problem in iOS 4 but not iOS 5.
【讨论】:
【参考方案3】:查看Problems with Page Cache in iOS 5 Safari when navigating back / unload event not fired的答案。
对我有用的答案是执行以下操作:
<body onunload="">
...
<script type="text/javascript">
if ((/iphone|ipod|ipad.*os 5/gi).test(navigator.appVersion))
window.onpageshow = function(evt)
// If persisted then it is in the page cache, force a reload of the page.
if (evt.persisted)
document.body.style.display = "none";
location.reload();
;
</script>
【讨论】:
仅供参考-如果您将其应用于 iframe 内的页面,则此方法不起作用,它必须位于托管 iframe 的整个页面上。或者,可能是因为我的 iframe 确实嵌入在另一个 iframe 中。是的,我正在使用第三方组件。 是的,这肯定需要在包含 iframe 的页面上。以上是关于在移动 Safari 中按下后退按钮后,Javascript 停止在 iframe 中执行的主要内容,如果未能解决你的问题,请参考以下文章
在浏览器中按下后退/前进按钮时,有没有办法在重新渲染之前改变行为