« さらば Paged List | メイン | CBL Partial Updater (20050922) リリース »

2005年09月22日

prototype.js のイベント順序

 prototype.js (1.3.1) を使用していて、奇妙な現象にぶつかったので、メモをかねてブログ。

 prototype.js を非同期モード (asynchronous:true) で実行している場合、 onComplete の後に onLoading が呼ばれることがある。

 原因は、prototype.js のこのコード:

if (this.options.asynchronous) {
  this.transport.onreadystatechange = this.onStateChange.bind(this);
  setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
}
onLoading を自前でスケジュールしている点。

 たぶん、なんらかの理由があってそうなっているんだろうけど (どうして?) 、イヤな仕様ですね。

 とりあえず、 onComplete ハンドラで onLoading ハンドラをリセットすることで、問題に対処しました。

投稿者 kazuho : 2005年09月22日 11:47 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/133

コメント

今、同じ現象で悩んでおります。

「onComplete ハンドラで onLoading ハンドラをリセット」
とは具体的にどのように対処すればよろしいのでしょうか?

javascriptにあまり慣れていないので対処できず困っています。

対処方法をご教授願えませんでしょうか?

投稿者 hideAki : 2006年01月19日 18:06

onComplete ハンドラの先頭で、
   this.options.onLoading = Prototype.emptyFunction;
としています。

投稿者 kazuho : 2006年01月23日 12:08

回答ありがとうございます!

protorype.jsの勉強不足を痛感しました。
ソースを読む以外に為になるサイトをご存知ですか?
教えて頂けると大変うれしいのですが。。。

お手間でなければ宜しくお願いします!

投稿者 hideAki : 2006年01月23日 12:54

> protorype.jsの勉強不足を痛感しました。
> ソースを読む以外に為になるサイトをご存知ですか?
> 教えて頂けると大変うれしいのですが。。。

あまり読んでないのですが、 http://blog.hawklab.jp/item-21.html あたりでしょうか。

投稿者 kazuho : 2006年01月23日 13:47

ありがとうございます!勉強してみます!

投稿者 hideAki : 2006年01月23日 14:35