重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

ひとつのエレメントに複数のイベントリスナーを登録した場合、各々のイベントはマルチタスクで動作するのでしょうか?

こちらでテストしてみたところ、先に登録されたイベントの動作途中で後のイベントの動作にジャンプしてしまっているような挙動が見られましたが、たまたまでしょうか?
この際エラーは特に出ていないようでした。

よろしくお願いします。

A 回答 (4件)

本来イベントは非同期(マルチスレッド)で動くべきのような気がしますが、


こちらでFirefox1.5 で試してみたところ(ブラウザによって違うのかもしれません、addEventListner のリファレンスには、登録したイベントハンドラが同期的に呼び出されるのか非同期的に呼び出されるのかについては、書かれていないようでした)
(3つのイベントハンドラにループ待ちの時間をそれぞれ設定し実行開始・終了時間を書き出すようにしてみた)
登録した順番に(前のハンドラの終了を待って次のハンドラが呼び出される)実行され、非同期に呼び出されるのではないようでした。

この回答への補足

その場合、終了というのはaddEventListnerに登録された関数の終了をもって判断するのでしょうか?
その辺がわからないと、タイマーでタイムアウトをチェックするなんて場合にとても怖いので・・。

補足日時:2006/04/19 17:05
    • good
    • 0

#2>この関数の処理が延々と長い場合、次のイベントはずっと呼ばれないのだろうか?


Firefoxで試してみたところでは、次にはいきません。
>非同期のオブジェクトであるXMLHttpRequestの呼び出しが行われた段階で、次のイベントに処理が移ったのだろう
コールバックで処理するようにしてあるならそうなると思います。
    • good
    • 0

仕様のみの話をすれば、DOM2 Events ではイベントリスナ発動の順序を定義していません。



現時点で Working Draft である DOM3 Events では、イベントリスナをグループ化し、グループ内における発動順を指定できるようです(しかしグループ間の発動順序は定義されません……実装次第ということでしょう)。

なお IE の attachEvent に関しては「the functions are called in random order」と MSDN に明記されています。

そういうわけですので、リスナ間でメッセージを送り合ってうまく調整して下さい。

参考URL:http://www.w3.org/TR/DOM-Level-3-Events/events.h …
    • good
    • 0
この回答へのお礼

実装しだいですか。
現時点ではプログラムでうまく管理するしかないようですね。
ありがとうございます。

お礼日時:2006/04/24 13:10

#1>その場合、終了というのはaddEventListnerに登録された関数の終了をもって判断するのでしょうか?


ごめんなさい、意味がよくわかりませんでした。
もう少し詳しく補足していただけますか?
(どちらにしても、私は実験的に得られた結果で言ってるだけですが)

この回答への補足

登録したはずなんですけど消えてました・・・なぜだろう。

わかりにくくてすみません。
言いたかったのは、イベントが起こると登録された関数が呼ばれるわけですが、この関数の処理が延々と長い場合、次のイベントはずっと呼ばれないのだろうか・・・という疑問だったのです。

今回こちらで起こった現象というのは、非同期のオブジェクトであるXMLHttpRequestの呼び出しが行われた段階で、次のイベントに処理が移ったのだろうと推測しています。
多分XMLHttpRequestオブジェクトを複数作成すれば同時に走らせてもきちんと動作する・・・のでしょう。

補足日時:2006/04/21 17:42
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!