- ベストアンサー
イベントリスナーの重複登録について
ひとつのエレメントに複数のイベントリスナーを登録した場合、各々のイベントはマルチタスクで動作するのでしょうか? こちらでテストしてみたところ、先に登録されたイベントの動作途中で後のイベントの動作にジャンプしてしまっているような挙動が見られましたが、たまたまでしょうか? この際エラーは特に出ていないようでした。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
本来イベントは非同期(マルチスレッド)で動くべきのような気がしますが、 こちらでFirefox1.5 で試してみたところ(ブラウザによって違うのかもしれません、addEventListner のリファレンスには、登録したイベントハンドラが同期的に呼び出されるのか非同期的に呼び出されるのかについては、書かれていないようでした) (3つのイベントハンドラにループ待ちの時間をそれぞれ設定し実行開始・終了時間を書き出すようにしてみた) 登録した順番に(前のハンドラの終了を待って次のハンドラが呼び出される)実行され、非同期に呼び出されるのではないようでした。
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#2>この関数の処理が延々と長い場合、次のイベントはずっと呼ばれないのだろうか? Firefoxで試してみたところでは、次にはいきません。 >非同期のオブジェクトであるXMLHttpRequestの呼び出しが行われた段階で、次のイベントに処理が移ったのだろう コールバックで処理するようにしてあるならそうなると思います。
- Chaire
- ベストアンサー率60% (79/130)
仕様のみの話をすれば、DOM2 Events ではイベントリスナ発動の順序を定義していません。 現時点で Working Draft である DOM3 Events では、イベントリスナをグループ化し、グループ内における発動順を指定できるようです(しかしグループ間の発動順序は定義されません……実装次第ということでしょう)。 なお IE の attachEvent に関しては「the functions are called in random order」と MSDN に明記されています。 そういうわけですので、リスナ間でメッセージを送り合ってうまく調整して下さい。
お礼
実装しだいですか。 現時点ではプログラムでうまく管理するしかないようですね。 ありがとうございます。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1>その場合、終了というのはaddEventListnerに登録された関数の終了をもって判断するのでしょうか? ごめんなさい、意味がよくわかりませんでした。 もう少し詳しく補足していただけますか? (どちらにしても、私は実験的に得られた結果で言ってるだけですが)
補足
登録したはずなんですけど消えてました・・・なぜだろう。 わかりにくくてすみません。 言いたかったのは、イベントが起こると登録された関数が呼ばれるわけですが、この関数の処理が延々と長い場合、次のイベントはずっと呼ばれないのだろうか・・・という疑問だったのです。 今回こちらで起こった現象というのは、非同期のオブジェクトであるXMLHttpRequestの呼び出しが行われた段階で、次のイベントに処理が移ったのだろうと推測しています。 多分XMLHttpRequestオブジェクトを複数作成すれば同時に走らせてもきちんと動作する・・・のでしょう。
補足
その場合、終了というのはaddEventListnerに登録された関数の終了をもって判断するのでしょうか? その辺がわからないと、タイマーでタイムアウトをチェックするなんて場合にとても怖いので・・。