Unload event in Opera
Sunday, 2. December 2007, 05:04:36
html ドキュメントに対するイベントのひとつに、unload というものがあります。このイベントは、ドキュメントが閉じられるときに発行されます。IE なんかだと、いろいろな要素にイベントハンドラを結びつけたままドキュメントを閉じるのはメモリリークの原因となったりする(らしい)ので、unload イベントで後片付けをしたりします。
これに対して Opera では、ドキュメントを閉じたりリロードしたりしても unload イベントが発行されません。ただし、ドキュメント内のリンクから他のドキュメントへ遷移する場合は発行されます。
ドキュメントを閉じる
Operaの場合、ドキュメントを閉じたとしても、閉じる前の状態を javascript の動作も含めて復元することができます。ドキュメントを閉じる = ドキュメントにまつわる情報を破棄する、ではないということです。一度閉じたドキュメントを復帰すると、つまり閉じたという動作自体がなかったことになっている。ということを考えると、ドキュメントを閉じる際に unload イベントを発行しないという動作はわからなくもありません。
ドキュメントをリロードする
問題はリロードです。リロードの場合は、その時点でのドキュメントの状態を破棄して、読み直すわけですからまさにドキュメントを一度閉じています。にもかかわらず Opera は unload イベントを発行しません。この動作は変です。
他のドキュメントへ遷移する
この場合は unload イベントが発行されます。それはそれでいいのだけど、なぜこの場合だけ発行されるのかはいまいち不明です。
そういうわけでドキュメントのリロードで unload イベントが発行されない意味だけがわかりません。これをどうにかできないのかなーと考えてみる。
な感じにするとよさそうです。ただ location.href=location.href なんてしたり、ツールバー上のリロードボタンを押した場合をどうしたものか。
これに対して Opera では、ドキュメントを閉じたりリロードしたりしても unload イベントが発行されません。ただし、ドキュメント内のリンクから他のドキュメントへ遷移する場合は発行されます。
ドキュメントを閉じる
Operaの場合、ドキュメントを閉じたとしても、閉じる前の状態を javascript の動作も含めて復元することができます。ドキュメントを閉じる = ドキュメントにまつわる情報を破棄する、ではないということです。一度閉じたドキュメントを復帰すると、つまり閉じたという動作自体がなかったことになっている。ということを考えると、ドキュメントを閉じる際に unload イベントを発行しないという動作はわからなくもありません。
ドキュメントをリロードする
問題はリロードです。リロードの場合は、その時点でのドキュメントの状態を破棄して、読み直すわけですからまさにドキュメントを一度閉じています。にもかかわらず Opera は unload イベントを発行しません。この動作は変です。
他のドキュメントへ遷移する
この場合は unload イベントが発行されます。それはそれでいいのだけど、なぜこの場合だけ発行されるのかはいまいち不明です。
そういうわけでドキュメントのリロードで unload イベントが発行されない意味だけがわかりません。これをどうにかできないのかなーと考えてみる。
- 以下のユーザーjsを組み込む
document.addEventListener('unload', function (e) { opera.postError('unload event fired: ' + location.href); __unload_event_fired__ = true; }, false); if (/\{ \[native code\] \}/.test(location.reload.toString())) { __old_location_reload__ = location.reload; location.reload = function () { if (!window.__unload_event_fired__) { document.dispatchEvent((function () { var e = document.createEvent('HTMLEvents'); e.initEvent('unload', true, true); return e; })()); } __old_location_reload__.call(location); }; }
- マウスジェスチャで呼び出しているすべての Reload コマンドを
Go to page, "javascript:void(location.reload())",1
に書き換える
な感じにするとよさそうです。ただ location.href=location.href なんてしたり、ツールバー上のリロードボタンを押した場合をどうしたものか。








How to use Quote function: