• ベストアンサー

イベントリスナーの重複登録について

ひとつのエレメントに複数のイベントリスナーを登録した場合、各々のイベントはマルチタスクで動作するのでしょうか? こちらでテストしてみたところ、先に登録されたイベントの動作途中で後のイベントの動作にジャンプしてしまっているような挙動が見られましたが、たまたまでしょうか? この際エラーは特に出ていないようでした。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

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

ategon
質問者

補足

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

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#2>この関数の処理が延々と長い場合、次のイベントはずっと呼ばれないのだろうか? Firefoxで試してみたところでは、次にはいきません。 >非同期のオブジェクトであるXMLHttpRequestの呼び出しが行われた段階で、次のイベントに処理が移ったのだろう コールバックで処理するようにしてあるならそうなると思います。

  • Chaire
  • ベストアンサー率60% (79/130)
回答No.3

仕様のみの話をすれば、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.html#Event-groups
ategon
質問者

お礼

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

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>その場合、終了というのはaddEventListnerに登録された関数の終了をもって判断するのでしょうか? ごめんなさい、意味がよくわかりませんでした。 もう少し詳しく補足していただけますか? (どちらにしても、私は実験的に得られた結果で言ってるだけですが)

ategon
質問者

補足

登録したはずなんですけど消えてました・・・なぜだろう。 わかりにくくてすみません。 言いたかったのは、イベントが起こると登録された関数が呼ばれるわけですが、この関数の処理が延々と長い場合、次のイベントはずっと呼ばれないのだろうか・・・という疑問だったのです。 今回こちらで起こった現象というのは、非同期のオブジェクトであるXMLHttpRequestの呼び出しが行われた段階で、次のイベントに処理が移ったのだろうと推測しています。 多分XMLHttpRequestオブジェクトを複数作成すれば同時に走らせてもきちんと動作する・・・のでしょう。

関連するQ&A

  • 登録済みイベントリスナーの情報を取得したい

    子画面に別機能をロードするようなページを作成しており、その子画面がオンロードで登録したイベントリスナーをクローズの際に削除するような仕組みにしています。 この処理を行う際、登録済みのリスナー情報を取得できる方法があれば知りたいのですが、方法がわかりません。 (無ければ無いで、管理マネージャーのような仕組みを作成しようと思っています。) よろしくお願いします。

  • イベントリスナを調べる方法についての質問です。

    イベントリスナを調べる方法についての質問です。 現在twitterのページで使われているJavaScriptの挙動を分析しているのですが、コード量が非常に多く苦労しています。 ある要素にどのようなイベントリスナが追加されたか、または追加されているかということを調べるいい方法はないでしょうか? addEventListenerで関数を登録した場合、element.onclickにセットされた関数を取得するというような方法が使えないので困っています。 bookmarkletやユーザースクリプト、アドオンなど何でもいいので、要素に追加されているイベントリスナを直接調べたり、あるいはイベントリスナが追加される瞬間を検出できるようないい方法があれば教えてください。 (解析はFirefox上で行っていますが、他のブラウザを使う方法でも構いません) 宜しくお願いします。

  • イベントリスナのコールバックメソッドは何故一つ?

    Android(JAVA)のイベントリスナについて教えてください >イベントリスナは、ひとつのコールバックメソッドを持つ View クラスのインターフェイスです。それらのメソッドは、リスナが登録されたビューでユーザがUI のアイテムにアクションを起こしたことがトリガとなり Android フレームワークにより呼び出されます ▽6.5 UIイベントハンドリング - ソフトウェア技術ドキュメントを勝手に翻訳   https://sites.google.com/a/techdoctranslator.com/jp/android/guide/ui/ui-events ・なぜ、コールバックメソッドをひとつしか持たないのでしょうか? ・複数持ってはいけないのでしょうか? ・インターフェイスだから? ・言語機能として複数保持出来ないことはないけれども、イベントリスナ的に分かりやすくするため(?)、敢えて機能毎に分けているのでしょうか? ■質問背景 ・ドキュメント見てたらそうなってたので、なんでかな? と思い質問しました ・複数インターフェイスにそれぞれ唯一の抽象メソッドを持たせず、1つのインターフェイスに複数の抽象メソッドを持たせたほうが分かりやすいような気もするのですが… 「View.AllListener」に「onClick()」「onLongClick()」みたいなのは何故ダメなのでしょうか?

    • ベストアンサー
    • Java
  • イベントリスナーのクラスの書きどころ

    まだまだ勉強したての超初心者で拙い質問ですが、宜しくお願い致します。 AWTのFrameクラスで参考書など何も無く勉強をしていたのですが、 イベントリスナーのクラスをどこに記述するのが一番良いのか、分かりません。 BaseFrameクラス、AFrameクラス、BFrameクラスが存在し、AFrame、BFrameはBaseFrameを継承しているとします。 windowOpened()の基本となる動作(「abc」という文字列を出力とする)はBaseFrameクラスの内部クラスに記述、 その後、AFrameクラスから実行されたFrameの場合は「abc」と出力された後に「def」と出力したい。 BFrameクラスから実行されたFrameの場合は「ghi」と出力された後に「abc」と出力したい。 とした時、AFrameクラスの方はAFrameの内部クラスで定義し、addWindowListener()により追加すれば実現出来たのですが、 BFrameクラスの場合は初めにBaseFrameクラスのwindowOpened()が実行されるので実現出来ません。 とすると、BaseFrameクラスにあるイベントリスナーの内部クラスから、 AFrame・BFrameクラスで実現したいイベントリスナーのクラスまで、 全てを完全に切り分けた方が良いのか?(切り分ければ可能だと思った) しかし、そうすると、他のコントロールについても同じ対応が必要であり、 コントロールとイベントの関連性が不透明化しないか?などと考えてしまい、 どうするのが一番か悩んでいます。どなたかご教示下さい。

    • ベストアンサー
    • Java
  • 問題はbind の付いたリスナーを削除できないこと

    リンク先で下記のように書かれていますが、どういう意味でしょうか? >問題は、bind の付いたリスナーを削除できないということ ・「bind の付いたリスナーを削除」しないと何がマズいのでしょうか? ・thisの挙動が変わったままになるから? ・thisの挙動が変わるというのは、Somethingの中だけの話ではないのでしょうか? ・この場合のリスナーは? addEventListener('click', this.onclick2を指すのでしょうか? >リスナーを後で削除できるように、そのリスナーへの参照を残しておく必要があります ・「リスナーへの参照を残しておく」って、具体的にどういうことなのでしょうか? https://developer.mozilla.org/ja/docs/Web/API/EventTarget.addEventListener

  • イベントリスナーがうまくいかない

    delBtnがない場合にイベントリスナーを読み込むとエラーが出てその後の処理が行われないため 下記のようにあった場合のみ予約するようにしたところ今度はクリックしても実行されない問題が起きました。 読み込み時は、エラーにならないようにし、かつボタンを押したときに要素を削除するようにするにはどうしたらよいでしょうか? var Result = document.getElementsByClassName('Result')[0].innerHTML = '<span class="u-mr-1rem">あああああ</span><input id="DelBtn" type="button" value="削除">; var Result = document.createElement('p'); BtnWrap.appendChild(Result); Result.classList.add('Result u-mtb-1rem'); var delBtn = document.getElementById('DelBtn'); if(delBtn !== null) { delBtn.addEventListener('click', function() { document.getElementsByClassName('Result')[0].remove(); }); }

  • イベントリスナーで読み込んだ後に、DOMで文字を表

    イベントリスナーで読み込んだ後に、DOMで文字を表示させたい。 DOMを使って、文字を表示させるならイベントリスナーで読み込み必要があると思いました。 そこで、下記のように書いて試してみました。 function hoge(){ this.view = function(){ window.addEventListener( 'load',this.foo, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); すると、「undefined」と表示されます。 どうすればいいのでしょうか。よろしくお願いします。

  • AS3 asファイルでイベントリスナが登録できない

    外部(as)ファイルに以下のようなメソッドを記述していたんですが // ***** エラー行 ***** とコメントアウトしている場所で、『型が見つからないか、コンパイル時定数ではありません。:Event。』というエラーが出てしまいます。 外部ファイルではイベントリスナは登録できないのでしょうか? 良かったら回答の方、よろしくお願いします。 public function jsonRead(){ var urlLoader:URLLoader = new URLLoader(); urlLoader.dataFormat = URLLoaderDataFormat.TEXT; urlLoader.addEventListener(Event.COMPLETE, jsonReadHandler); urlLoader.load(new URLRequest("json_text.json") ); function jsonReadHandler(e:Event):void{ // ***** エラー行 ***** var json_data:String = URLLoader(e.currentTarget).data; // ターゲットからテキストデータを取得して変数に代入 var json_decode_data:Object = JSON.parse(json_data); // 読み込んだテキストをjsonオブジェクトにデコード this.pages_of_book = Number(json_decode_data[0].number); trace(this.pages_of_book); } // jsonReadHandler() } // jsonRead()

    • ベストアンサー
    • Flash
  • JSのイベントターゲット が難しい

    JSのイベントターゲット (EventTarget)が難しくてよくわからないのですが初心者にもわかるように解説していただけるとありがたいです。 https://developer.mozilla.org/en-US/docs/Web/API/EventTarget イベントターゲット(EventTarget)は、DOMイベントを受け取り、それらへのリスナーを持つことが出来るオブジェクトによって実装されるDOMインターフェースです。 Elementと、 documentと、 windowは、ほとんどの共通イベントターゲットですが、 例えば、XMLHttpRequest、AudioNode、AudioContextなど、 他のオブジェクトもエベントターゲットになることが可能です。 多くのイベントターゲット(Element、document、windowを含む)は、 onXXXプロパティと属性を介して、 イベントハンドラの設定もサポートします。 メソッド .addEventListener() 要素にイベントハンドラを登録します。 .dispatchEvent() DOM内のノードのイベントを実行します。 .removeEventListener() EventTarget.addEventListenerを使用して登録されたイベントリスナーを削除します。 イベントを発動させる要素につけるイベントファンクションのようなものなのでしょうか?

  • SWTのイベント発生

    (質問) SWINGではなくSWTで自作のEVENT発生のプログラムを作りたい場合どのように記述すればよいのでしょうか。SWTでEVENTなどを継承しようとするとエラーになります。 SWTはSWINGに比べてサイトも少なく参考になりそうなところが探し出せませんでした。ご存知の方がおられましたら 教えていただけないでしょうか。 やりたいことはあるクラスからリスナーを登録してイベントの発生を知ることが出来ればいいのですが。

専門家に質問してみよう