2012年07月01日
イベント登録順で処理されない
比較的知られている話ですが、addEventListener, attachEvent で、
イベントハンドラを複数登録できます。
複数登録されたイベントハンドラは、つい登録した順番に実行されるのかと思いましたが、
保証されているわけではありません。実際に、実行順序が登録順ではない場合もあるようです。
もし、各ライブラリが完全独立していて、
イベントハンドラを登録順に実行したい場合はどのようにすればよいかというと、
登録したいイベントハンドラを配列に格納しておき、
配列の中身を順番に実行する処理を、ひとつだけイベントハンドラとして
登録しておく手段があります。
だいたい、以下のようなコードになると思います。
var onloader = function() {
var self = arguments.callee;
var handlers = [];
self.addEvent = function(func){
handlers.push(func);
}
// onLoad 処理で、イベントハンドラが登録された順番に実行する
function onLoad(){
for(var ind = 0, max = handlers.length; ind < max; ind++) {
if(handlers[ind]) {
handlers[ind]();
}
}
}
// イベントハンドラ登録
if(window.attachEvent) {
window.attachEvent('onload', onLoad);
} else if(window.addEventListener) {
window.addEventListener('load', onLoad);
}
return self;
};
イベントハンドラを複数登録できます。
複数登録されたイベントハンドラは、つい登録した順番に実行されるのかと思いましたが、
保証されているわけではありません。実際に、実行順序が登録順ではない場合もあるようです。
もし、各ライブラリが完全独立していて、
イベントハンドラを登録順に実行したい場合はどのようにすればよいかというと、
登録したいイベントハンドラを配列に格納しておき、
配列の中身を順番に実行する処理を、ひとつだけイベントハンドラとして
登録しておく手段があります。
だいたい、以下のようなコードになると思います。
var onloader = function() {
var self = arguments.callee;
var handlers = [];
self.addEvent = function(func){
handlers.push(func);
}
// onLoad 処理で、イベントハンドラが登録された順番に実行する
function onLoad(){
for(var ind = 0, max = handlers.length; ind < max; ind++) {
if(handlers[ind]) {
handlers[ind]();
}
}
}
// イベントハンドラ登録
if(window.attachEvent) {
window.attachEvent('onload', onLoad);
} else if(window.addEventListener) {
window.addEventListener('load', onLoad);
}
return self;
};
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
no image
posted by FJT at 22:32| javascript