web-dev-qa-db-ja.com

Internet Explorer11の戻るボタンJavascriptの動作

Chrome、FF、およびIE8-10では、戻るボタンを押すと、javascript $(document).ready()関数が呼び出されますが、IE11では、javascriptは呼び出されません。 IE11を他のすべてのブラウザーと同じように応答させ、コードに一貫性を持たせる方法を知っている人はいますか?

<script type="text/javascript">

    alert("Are we called?"); // neither is this called in IE11
        $( document ).ready( function() {
            alert("document ready"); // does not get fired after hitting back on IE11
        });
</script>

IE11の厄介な問題は、開発者ツールをオンにして問題のトレースまたはデバッグを開始すると、IE10として動作し、戻った後に.ready()を呼び出すことです。

このヘッダーを介してこのページでキャッシュを無効にしました。これも、サポートしようとしている他のすべてのブラウザー(IE8-10、FF、およびChrome)で機能します。

Cache-Control: no-cache
15

了解しました。過去2時間問題を解決した後、これが私の調査結果です。

次のイベントは、バックとフォワードの間で呼び出されることはありません。

IE11は、JavaScriptの状態を含むページ上のすべてをキャッシュするため、通常のイベントは発生しません。戻る/進むボタンを使用してページ間を行ったり来たりすると、JavaScriptコードは、中断されたことを通知されることなく、状態を再開するだけです。開発者にとっては失礼なことですが、これをトリガーとするイベントがあるかもしれませんが、私は確かにそれについて知りません。

とにかく、この動作は このページはボールでいっぱいです で見ることができます。 IE11では、google.comに移動してから押し戻すと、すべてのボールが同じ正確な場所にあり、すべてが引き続き機能することに注意してください。他のすべてのブラウザでは、ページが再初期化され、ボールが天井から再び落下します。 IE11の動作が有用で有益なシナリオを見ることができますが、Microsoftがそのようにしたくない場合のドキュメントを提供してくれることを願っています。また、デフォルトが他のすべてのブラウザと同じであり、独自のIE9やIE10を含むすべてとの互換性をすべて壊すのではなく、この機能をオプションにするとよいでしょう。

それで、タイマーを開始すると、中断したところから開始するだけだと気づきました。このコードはビジーウェイトハックなので好きではありませんが、私が望むことを実行します。誰かがそれほど忙しくないより良い何かを考えることができれば素晴らしいでしょう...

<!-- IE11 back/forward hack - http://stackoverflow.com/questions/21274085/internet-Explorer-11-back-button-javascript-behavior -->
<script type="text/javascript">
    var dumbIEHistory=history.length;
    function busyWaitCheckForHistoryChange() {
        if (history.length != dumbIEHistory) {
            alert("History has changed, back/forward has been pressed, run my function!");
            myFunction();
            dumbIEHistory=history.length;
        }
    }

// using http://www.pinlady.net/PluginDetect/Browsers/ to do browser detection
    $( window ).load(function() {
        if (browser.isIE && browser.verIE >= 11) {
            // let's not bog down all the other browsers because of IE11 stupidity
            window.setInterval("busyWaitCheckForHistoryChange()", 1000);
        } else {
            // in other browsers, this will be called when back/forward is pressed
            myFunction();
        }
    });
</script>

戻る/進むボタンが押されたときにキャッチするために行っていることで機能します。これは、押し返した後、履歴の長さが+1になるためです。ユーザーがすばやく前後に移動する場合、関数が呼び出されるまでに1秒かかることがあります。それが懸念される場合は、間隔を短くすることができます。これが他の人に役立つことを願っています。

10

これはBFキャッシュと呼ばれ、FF1.5から使用されています。

pageshowイベントにバインドすると、event.persistedがキャッシュから提供されたかどうかを通知します。

http://msdn.Microsoft.com/library/ie/dn265017(v = vs.85).aspx

https://developer.mozilla.org/en-US/docs/Using_Firefox_1.5_caching

8
Robert Daly

また、この問題が発生しました。これは、IEDoc。RobertDalyが書いたように、 http://msdn.Microsoft.com)を読んでも明らかにバグではありません。 /library/ie/dn265017(v=vs.85).aspx このドキュメントで、beforeunloadイベントがBFキャッシュを防止していることがわかります。したがって、このイベントを定義する短いコードがここにあります。 BFキャッシュを防ぐためのコンソール:

if (typeof window.onbeforeunload != 'undefined'){
   function doNothing(){
      console.log('Prevent BF Cache');
   }
   window.onbeforeunload = doNothing;
}
5
betelgeuz