在移动 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 中执行的主要内容,如果未能解决你的问题,请参考以下文章

在android中按下后退按钮后如何返回相同的选项卡?

在浏览器中按下后退/前进按钮时,有没有办法在重新渲染之前改变行为

在 jQuery Mobile / Mobile Safari 中按下提交后不要隐藏键盘

如何禁用在android片段类中按下的后退按钮

在父活动上按下后退按钮

如果在 Fragment 的 WebView 中按下后退按钮,如何返回上一页?