2008-03-08(土)
戻るボタンとonloadイベント
ブラウザの戻るボタン(history.back)で戻った時にonloadイベントが走るかどうかは、ブラウザによって違うようです。
まず、IEですが、戻るボタンのときもonloadイベントが走ります。よって、なんにも心配要らないです。
次に、Firefoxではbfcacheと言う機能があり、以下の事情になってます。
ユーザがキャッシュされたページにナビゲートしたとき、インラインスクリプトと onload ハンドラは実行されません。
(中略)
ユーザがそのページから去るナビゲートをするときに実行されるようにしたい動作があるものの、この新しいキャッシュ機能を生かしたく、さらにそれゆえに unload ハンドラを使用したくないという場合は、新しい pagehide イベントを使用します。
と言うことで、Firefoxのことを考えるのなら、onpageshowイベントを監視しましょう。渡って来るeventオブジェクトに、persisted値があります。これがtrueだとキャッシュからの実行*1なので、処理が必要になります。
最後に、Safariですが、こいつも戻るボタンで遷移した場合はonloadハンドラを呼びません*2。ので、先ほどのFirefoxのドキュメントに乗っていた、「unloadイベントがあるとキャッシュしない」の性質を利用します。この性質は当然Firefoxのものではありますが、「unloadがある → スクリプトの終了処理をしている → この状態を保持しても、スクリプトはもう使えない → キャッシュしない」と考えれば、
Safariでも同じ事情になっている可能性が高い、との推論です。
では、検証してみましょう。
<body onload="alert('test');">
と書くと戻るボタンでアラートが出ません。
<body onload="alert('test');" onunload="">
と書くと、見事、戻ってもアラートが出ます。推論通りの動きになりました。
ってことで、困ったときはお試し下さい。ただし、これをやるとキャッシュ機能を完全に無効にしてしまうため、動的に生成するページ等で利用するとパフォーマンス上の大きな障害となりえます。よく考えて使うべきでしょう。
- 2038 http://d.hatena.ne.jp/koumiya/20080916/1221580149
- 1408 http://www.trustworks.biz/blog/2008/05/historybackonload.html
- 442 http://okyuu.com/ja/question/6823
- 329 http://b.hatena.ne.jp/entry/d.hatena.ne.jp/hiratara/20080308/1204955060
- 278 http://q.hatena.ne.jp/1222076884
- 84 http://depthcode.com/2010/10/onunload.html
- 72 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4DAJP_jaJP251JP253&q=java+String+配列+キャスト
- 70 http://www.google.co.jp/url?sa=t&rct=j&q=ブラウザ戻るボタン を検出&source=web&cd=2&sqi=2&ved=0CCUQFjAB&url=http://d.hatena.ne.jp/hiratara/20080308/1204
- 64 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=FOs&q=rss 安全性&btnG=検索&lr=lang_ja
- 52 http://www.google.co.jp/url?sa=t&rct=j&q=戻るボタン検知&source=web&cd=3&ved=0CC4QFjAC&url=http://d.hatena.ne.jp/hiratara/20080308/1204955060&ei=5QOgTpDyN-X2mAXSv5n2BA&usg=AFQjCNEbXQHkIAj_ooH1egu





