Firefoxの歴史に戻った後、JavaScriptは実行されません


84

Firefoxの[戻る]ボタンを使用して以前にアクセスしたページにアクセスすると、そのページのスクリプトが再度実行されません

2回目にページを表示したときにスクリプトを再度実行するための修正/回避策はありますか?

私はGoogleChromeとInternetExplorerで同じページをテストしましたが、意図したとおりに機能することに注意してください。


問題をテストするために使用したファイルと手順は次のとおりです。

(0.htmlに移動し、クリックして1.htmlに移動し、戻るボタン)

0.html

<html><body>
<script>
  window.onload = function() { alert('window.onload alert'); };
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

1.html

<html><body>
<p>Go BACK!</p>
</body></html>

回答:


92

window.onunloadで呼び出される空の関数を設定します。

window.onunload = function(){}; 

例えば

<html><body>
<script type="text/javascript">
  window.onload = function() { alert('window.onload alert'); };
  window.onunload = function(){};
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

出典: http //www.firefoxanswer.com/firefox/672-firefoxanswer.html (アーカイブ版)


2
ありがとう、それは動作します。デフォルトのonunloadハンドラーが何をするかについてのヒントはありますか?(たとえば、ここで何らかのデフォルトの動作をオーバーライドしていますか?)
Patonza 2010

わかりました、調査します。もう一度ありがとう、この問題はしばらくの間私を悩ませてきました:)
Patonza 2010

他のブラウザが必要としないのにFireFoxがこれを必要とする理由を誰かが知っていますか?
Pim Jager 2010

7
何もオーバーライドしていません。これにより、FirefoxがページをBack-Forward Cache(bfcache)にキャッシュできなくなります。developer.mozilla.org/en/DOM/window.onunload developer.mozilla.org/En/Using_Firefox_1.5_caching
クリス・ハース

1
それは一方でなければならない、特にあなたが戻ったときに、ロードされたiframeのURLが再びロードされ、生成されたコンテンツは、フレーム内に配置することが必要であれば、crossbrowserがあるようには思えない- bfcacheを破る残念ながら、まだ前のページを覚えているようですそれを新たに更新する方法。
NoBugs 2015年

76

Firefoxの[戻る]ボタンを使用して以前にアクセスしたページにアクセスすると、そのページのスクリプトが再度実行されません。

それは正しいです、そしてそれは良いことです。

Firefox(およびSafari、Opera)でリンクをヒットしても、ページがすぐに破棄されて次のページに移動することはありません。それはページを無傷に保ち、単にそれを非表示にします。戻るボタンを押すと、ドキュメントを再度ロードしなくても、古いページが表示されます。これははるかに高速であり、ユーザーのページへの前後の遷移がスムーズになります。

この機能はbfcacheと呼ばれます。

ユーザーが前回ロードして使用したときにページに追加したコンテンツは、引き続きそこにあります。ページ要素にアタッチしたイベントハンドラーは引き続きアタッチされます。設定したタイムアウト/間隔は引き続きアクティブです。したがって、隠されて再表示されたことを知る必要がある理由はほとんどありません。onloadスクリプトコードを再度呼び出したりインライン化したりするのは間違いです。その関数で行ったバインディングとコンテンツの生成は、同じコンテンツに対して2回実行され、悲惨な結果を招く可能性があるためです。(たとえばdocument.write、インラインスクリプトでは、ページが完全に破壊されます。)

への書き込みwindow.onunloadが効果を発揮する理由は、bfcacheを実装するブラウザが、破棄されるタイミングを本当に知る必要があるページとの互換性のために、いつonunload発生するかを知ることに関心があると宣言するページは、bfcacheに無効になります。そのページは、bfcacheからフェッチされるのではなく、戻ったときに新しくロードされます。

したがって、を設定した場合window.onunload= function() {};、実際に行っているのは、意図的にbfcacheを破壊することです。これにより、ページのナビゲートが遅くなるため、最後の手段として使用しないでください。

bfcacheを台無しにすることなく、ユーザーがいつページを離れるか、ページに戻ったかを知る必要がある場合は、代わりにイベントonpageshowonpagehideイベントをトラップできます。

window.onload=window.onpageshow= function() {
    alert('Hello!');
};

3
私の問題は、bfcacheがすべてのページをキャッシュしないため、失われたコンテンツを再構築するためにjsを再実行する必要があることです。したがって、ページ全体をスラッシングしても問題ない可能性があります。とにかく、私はwindow.onloadイベントを使用しておらず、jQuerydocument.readyイベントを使用しています。document.readyを引き続き使用して、この問題を回避する方法を知っていますか?
パトンザ2010

bfcacheは通常、ページ全体を残されたときの状態で返す必要があります。前のページから戻った後に欠落しているコンテンツは何ですか?(テストケース?)document.readyは基本的にと同じようにwindow.onload機能します(一部のブラウザーでは、とにかく同じイベントです)。
bobince 2010

14
キャッシュされていることを考えると、JavaScriptが再度実行されないため、これは良いことではありません...しかし、JavaScriptが以前に行った変更を実際にキャッシュすることはありません。javascriptがページの読み込み時に要素でフェードインした場合、履歴にアクセスしたときに再びフェードインすることはありません...しかし、不透明度0で再びフェードインし、javascriptが行ったことを元に戻します!それはすべてか何もない必要があります。javascriptを再度実行せずにキャッシュされた状態で表示する場合は、javascriptの実行後にページの完全な状態をキャッシュする必要があります。
ジンボジョニー2012

1
@Jimbo:テストケースをお願いします。bfcacheは、非表示/表示でDOMの正確な状態を保持することを目的としています(そして、これまでに見たすべての場合にそうします)。フェードインされた要素は、他のスクリプトを実行して再度非表示にしない限り、ページに戻ったときに不透明なままになります。
bobince 2012

1
@ bobince-不透明度をゼロに設定するCSSファイルで要素を作成し、jQueryを使用してドキュメントにフェードインできるようにします。履歴に戻ると、フェードイン時にJSがスタイル属性に追加した不透明度:1を維持せずに、スタイルシートCSS(ゼロ)を再適用します。最初にページにアクセスすると、要素はゼロから1にフェードインします。別のページに移動して反撃すると、完全に透明になります。
ジンボジョニー2012

23

イベントのpersistedプロパティを確認できpageshowます。最初のページの読み込み時にfalseに設定されます。ページがキャッシュからロードされると、trueに設定されます。

window.onpageshow = function(event) {
    if (event.persisted) {
        alert("From bfcache");
    }
};

何らかの理由で、jQueryにはイベントでこのプロパティがありません。ただし、元のイベントから見つけることができます。

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
        alert("From bfcache");
    }
});

javascriptとjqueryの両方のバージョンを提供していただきありがとうございます!あなたはそこで最後に閉じ括弧を逃しました(これはうめき声ではありません!)。また、他の人のために、IEとChromeのレポート.persistedは、関係なく常にfalseであることに注意してください。
マグナススミス

Magnusが指摘したように、これは、ifステートメントを削除するまでChromeでは機能しませんでした。
ジャスティン

これは、Chrome 58.0.3029.110(64ビット)およびFF 53.0.2(64ビット)で変更なしで機能しました。
kmoser 2017年

1

何もしない「onunload」イベントに接続します。

<html><body>
<script type="text/javascript">
  window.onload = function() { alert('window.onload alert'); };
  window.onunload = function(){}; 
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

よくわかりませんが、私は賛成票を投じました。誰かがこの質問に対するすべての回答に反対票を投じたようです...
Patonza 2010

onunloadイベントをページに追加すると、実際にはページ全体がキャッシュされないようになるという回答を追加する必要があります。これにより、JSが再度実行されるだけでなく、サーバーの負荷が一段高くなります。これは実際には軽く取る提案ではありません。これは慎重に検討する必要があります。
dreagan 2015

@dreagan、これはbfcacheを無効にしますが、必ずしもHTTPキャッシュを無効にするわけではありません。HTTPキャッシュには、他のすべてのルールセットがあります。そこにサーバー側のスリープをスローすると、クリックバック中にそれに気付くはずです。Mozillaは、BFCacheFAQの3番目の質問でこれについて話します
クリス・ハース

私はBFcacheについて話していましたが、それを指定する必要がありました。これは、OPに結果を通知せずにこのような提案を行う必要があるという意味ではありません。別の方法は、onpopstateイベントを使用して、JavaScriptを再起動することです。
dreagan 2015

理解できるかどうかはまだわかりません。クライアントのローカルbfcacheがバイパスされた場合、なぜ「サーバーの負荷が1ノッチ上がる」のでしょうか。はい、DOMを再構築する必要がありますが、HTMLはクライアントのHTTPキャッシュの一部である必要があります。はい、追加のリソースをリロードする必要がありますが、それらもクライアントのHTTPキャッシュの一部である必要があります。についてはonpopstate、この質問がほぼ5年前に尋ねられたとき、そのイベントはまだ比較的新しく、ブラウザのサポートは非​​常に一貫性がありませんでした
Chris Haas

1

私の知る限り、FirefoxはonLoadバックでイベントを発生させません。

こちらのリンクに基づいて、代わりにonFocusをトリガーする必要があります


テストしたところ、空のwindow.onunloadハンドラーを設定しなくても、windows.onfocusは実際に呼び出されます。onunloadの設定は少し良い回避策ですが、.onfocusも問題ないはずです。ありがとう:)
Patonza 2010

1

ユーザーがブラウザの履歴を使用してページに戻ったときにJavaScriptを実行させる簡単な方法は、OnPopStateイベントです。これを使用して、ホームページ(https://fynydd.com)でビデオを一時停止および再生します

window.onpopstate = function() {

    // Do stuff here...
};

0

ajax操作のようないくつかのケースではURL変更リスナーを使用できます

$(window).on('hashchange', function() {
        ....
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.