在 Safari、iOS 上使用 History API 后,警报、确认和提示不起作用

Posted

技术标签:

【中文标题】在 Safari、iOS 上使用 History API 后,警报、确认和提示不起作用【英文标题】:Alert, confirm, and prompt not working after using History API on Safari, iOS 【发布时间】:2016-10-31 05:21:28 【问题描述】:

ios 的 Safari 中调用 history.pushState 后,在使用浏览器后退按钮变回时,无法再使用 alert()confirm()prompt()

这是 iOS 错误吗?是否有任何已知的解决方法?

重现此行为的简单示例:

<html>
  <body>
    <ul>
      <li>Step 1: <button onclick="alert(Math.random())">Confirm Alert is working</button></li>
      <li>Step 2: <button onclick="history.pushState(null, null, '/debug/'+Math.random());">Change History</button></li>
      <li>Step 3: use your browser back button, to go back</li>
      <li>Step 4: <button onclick="alert(Math.random())">Alert is not working anymore</button></li>
    </ul>
  </body>
</html>

您可以在这里在线试用:goo.gl/faFW6o。

【问题讨论】:

@JacobHeater 不幸的是,它不是在独立运行时(没有 iframe) @JacobHeater 我在描述中添加了一个现场演示。请随时在那里尝试一下。 您是否在 Safari iOS 上进行测试? 我用上面的复制步骤打开了 rdar://45141145。他们要求我提交系统诊断和问题视频,我刚刚完成了。 这是我的发现,一旦你使用 ios safari 后退按钮,我认为浏览器会从缓存中加载内容,因此 js 无法正常工作。而不是使用使用 window.history.go(-1) 的后退按钮。我试图检测后退按钮,但我失败了。另外尝试了这个,但它没有刷新。也许我错过了一些东西 window.onpageshow = function(event) if (event.persisted) window.location.reload() ; 【参考方案1】:

一种解决方法是改为按钮上的属性 onload,创建一个添加侦听器的函数,然后在 window.onpopstate 和 window.onload 上调用它..

【讨论】:

请不要回答评论/问题。可以理解的是,您的代表太低而无法发表评论,但这并不意味着应该使用答案来使 cmets 作为替代方案。【参考方案2】:

这是因为 Safari 中的后向缓存。

您可以使用以下代码在按下返回按钮时强制重新加载。

window.onpageshow = function(e)  // e -> event
    if (e.persisted) 
        window.location.reload(); 
    
;

另外,如果你使用的是 jQuery ...

$(window).bind("pageshow", function(e)  // e -> event
    if (e.originalEvent.persisted) 
        window.location.reload();
    
);

【讨论】:

以上是关于在 Safari、iOS 上使用 History API 后,警报、确认和提示不起作用的主要内容,如果未能解决你的问题,请参考以下文章

iOS7 中缺少 safari history.plist 文件

onclick="history.back() 在 Safari 和 IE 中不起作用

Navigation Controller push SFSafariViewController,防止 Safari 在 egdeswipe back in history 时弹出

iOS 以编程方式删除浏览历史记录

越狱 iPhone 上 Safari 的阅读历史

图像无法在 iOS 上的 Safari 上加载