37

私が見つけた問題は、デスクトップ上のSafariが問題を解決したように見えることを除いて、この質問と非常によく似ています。基本的に、問題は次のとおりです。クライアントがモバイルサファリでブラウジングしていて、ページがでjavascript関数を実行しpageA.html、に移動しpageB.html、戻るボタンを押してに戻るとpageA.html、クライアントがを押したときにjavascript関数が実行されません。に戻るための戻るボタンpageA.html。javascriptの呼び出しをスキップします。

上記のリンクに記載されている解決策を試しましたが、モバイルSafariでは何も機能しないようです。他の誰かがこのバグに遭遇しましたか?どのように処理しましたか?

4

1 に答える 1

94

これはバックフォワード キャッシュが原因です。ユーザーが移動したときにページの完全な状態を保存することになっています。ユーザーが [戻る] ボタンで戻ると、キャッシュからページをすばやく読み込むことができます。これは、HTML コードのみをキャッシュする通常のキャッシュとは異なります。

bfcacheonloadイベントのためにページが読み込まれると、トリガーされません。代わりに、イベントのpersistedプロパティを確認できます。onpageshow最初のページ読み込み時に 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() { });
于 2012-09-29T11:04:26.860 に答える