prototype.js の Event.observe を使った onbeforeunload について
2007-07-20-1: [JavaScript][Firefox]
JavaScript のイベントに、ウィンドウが閉じられる直前に起こる onbeforeunload があります。
これを使うと、何がしかの内容を入力中にページを移動する際に警告のメッセージを出すことができます。
WordPress とかで利用されています。
使い方は簡単で、以下のようにダイアログに表示する任意のメッセージを返します。
window.onbeforeunload = function(e) {
// なにも返さなければ、なにも起きない。
return '<任意のメッセージ>';
};
ダイアログの表示は以下のようになります。
- Internet Explorer 6.0
- Internet Explorer 7.0
- Firefox 2.0.0.5
- Safari 3.0.2 (beta)
本題はここからで、これを prototype.js の Event.observe を使った場合はどうなるかということです。
まず、素直にやってみます。
Event.observe(window, 'beforeunload', function(e) {
return '<任意のメッセージ>';
});
これでうまくいくと思いきや、どころがどっこい Safari 3.0.2 (beta) ではうまくいきますが、IE 6.0/7.0、Firefox 2.0.0.5 ではダイアログが表示されません。
次に、以下のように returnValue に値を入れてみます。
Event.observe(window, 'beforeunload', function(e) {
e.returnValue = '<任意のメッセージ>';
});
これだと、IE 6.0/7.0、Firefox 2.0.0.5 ではうまくいきますが、Safari 3.0.2 (beta) ではだめでした。
上記の結果、以下のようにすれば IE 6.0/7.0、Firefox 2.0.0.5、Safari 3.0.2 (beta) でもうまくいくことがわかりました。
Event.observe(window, 'beforeunload', function(e) {
// イベントをキャンセルする場合は、なにも返さない。
return e.returnValue = '<任意のメッセージ>';
});
まあ、window.onbeforeunload で問題ないわけなので、Event.observe を使う必要はないかもしれませんが、10 分ほどはまってしまったので、メモとして残しておきます。
ちなみに onbeforeunload は、手元にある限りでは IE 6.0/7.0、Firefox 2.0.0.5 で対応していて、Opera 9.22 とか Netscape 7.1 では対応していませんでした。