JavaScript にて、イベントあたり複数のハンドラを実行するためにチェインを作ろうとしたんだけれども、待避先に困るねぇ、という話において。
window.onloadのインスタンスをトラップしてなんとかするやりかた。ウチはちょっと前まではこの方法をとっていたのだけど、おっしゃるとおりって、そこはかとなくメンドクサイし、似たような記述ブロックを毎度用意するのもアレな気がしたので、先の例示のような方法に変えてみてる次第ッス。window.onloadの退避先がグローバル変数になってしまっているので、名前が被らないように注意する必要があ
(複数の外部 JavaScript に分かれた複数の関数を window.onload で実行 (2) @ ねこめしにっき(2003年7月上旬) より)
関数のオーバーライドを行う場合、待避用の関数名にはパッケージやライブラリの名前を使うのが比較的安全だろう。
(一意な関数名 @ Latest topics (2003/07/09) より)
うーん。手元で試してみた限りではクロージャが効くので、ローカル変数に封じ込めるのが得策と思うですよ。例えば:
function addEvent(obj, eventName, fn)
{
var prev = obj[eventName];
obj[eventName] = prev ? function() { fn() ; prev() } : fn;
}
addEvent( window, 'onload', function() { alert('6') } );
addEvent( window, 'onload', function() { alert('5') } );
addEvent( window, 'onload', function() { alert('4') } );
みたいなのとか。まぁ、(元ハンドラを)別の場所から参照させたい、という場合は困りますが。
登録のしかたが面倒なので、ヘルパーを作ってもいいかもしれない。
window.addOnload = function(fn) { addEvent(window, 'onload', fn) };
window.addOnload( function() { alert('3') } );
window.addOnload( function() { alert('2') } );
window.addOnload( function() { alert('1') } );
本当は window.addOnload = function(fn) { addEvent(this, 'onload', fn) } にしたかったんだけど WinIE6 で NG。this は実行時束縛のはずなのに…。