web-dev-qa-db-ja.com

Safari、iOSでHistory APIを使用した後、アラート、確認、およびプロンプトが機能しない

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

43
dan

これは、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();
    }
});

回避策の1つは、代わりにボタンのプロパティonloadで、リスナーを追加する関数を作成し、それをwindow.onpopstateとwindow.onloadで呼び出します。

0