hagino3000's blog

平成アーカイブス (更新停止)

IE6でPrototype.jsのEvent.observeした処理の実行順序が期待通りにならないのが実は仕様通りでしたという件

職場でIE6だとjavascriptエラーが出るというバグを調べてみたら、Prototype.jsのEvent.observeで登録した処理が、登録順に実行されてなかったという。ぐぐってみたら既に検証されている方がいました。Prototype.jsの問題ではなくattachEventで登録された処理の実行順序がカオスっているのが原因みたいです。

コード

subsystem.Hogehoge = function(){

  return {
    initialize : function(){
      // こっちより
    },
    doHoge : function(){
      // こっちが先に実行されてしまう
    }
  }

}();

Event.observe(window, 'load', function(){
// 先に初期化
subsystem.Hogehoge.initialize();
});

Event.observe(window, 'load', function(){
// この時は初期化されてるはず……だが
subsystem.Hogehoge.doHoge();
});

実は仕様通りでした。

MSDNでattachEventの仕様を見てみると、同一オブジェクトに複数functionをattachした場合はランダム順で実行されると明記されてます……。(正直この仕様はありえないだろうjk)

If you attach multiple functions to the same event on the same object, the functions are called in random order, immediately after the object's event handler is called.

attachEvent Method (A, ABBR, ACRONYM, ...)

他にもIEだと

Event.observe(document, 'dom:loaded' function(){hoge();});

で登録しておいた処理が永遠に実行されない時があったなぁ。あれは何だったんだろう。