Firefoxの[戻る]ボタンを使用して以前にアクセスしたページにアクセスすると、そのページのスクリプトが再度実行されません。
それは正しいです、そしてそれは良いことです。
Firefox(およびSafari、Opera)でリンクをヒットしても、ページがすぐに破棄されて次のページに移動することはありません。それはページを無傷に保ち、単にそれを非表示にします。戻るボタンを押すと、ドキュメントを再度ロードしなくても、古いページが表示されます。これははるかに高速であり、ユーザーのページへの前後の遷移がスムーズになります。
この機能はbfcacheと呼ばれます。
ユーザーが前回ロードして使用したときにページに追加したコンテンツは、引き続きそこにあります。ページ要素にアタッチしたイベントハンドラーは引き続きアタッチされます。設定したタイムアウト/間隔は引き続きアクティブです。したがって、隠されて再表示されたことを知る必要がある理由はほとんどありません。onload
スクリプトコードを再度呼び出したりインライン化したりするのは間違いです。その関数で行ったバインディングとコンテンツの生成は、同じコンテンツに対して2回実行され、悲惨な結果を招く可能性があるためです。(たとえばdocument.write
、インラインスクリプトでは、ページが完全に破壊されます。)
への書き込みwindow.onunload
が効果を発揮する理由は、bfcacheを実装するブラウザが、破棄されるタイミングを本当に知る必要があるページとの互換性のために、いつonunload
発生するかを知ることに関心があると宣言するページは、bfcacheに無効になります。そのページは、bfcacheからフェッチされるのではなく、戻ったときに新しくロードされます。
したがって、を設定した場合window.onunload= function() {};
、実際に行っているのは、意図的にbfcacheを破壊することです。これにより、ページのナビゲートが遅くなるため、最後の手段として使用しないでください。
bfcacheを台無しにすることなく、ユーザーがいつページを離れるか、ページに戻ったかを知る必要がある場合は、代わりにイベントonpageshow
とonpagehide
イベントをトラップできます。
window.onload=window.onpageshow= function() {
alert('Hello!');
};