• ベストアンサー

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

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

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

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

# No.1 は質問内容を誤読してました。 eventTarget.onclick = function() { .. } のようにレガシーな書き方をしている場合は No.1 のように String 変換すれば内容を取得&編集可能です。 addEventListener/attachEvent した場合はオーサからリスナー登録状況を見ることはできませんので、管理マネージャを自作して下さい。 # たとえば prototype.js では Event.observers にイベントリスナをキャッシュしています。

参考URL:
http://prototype.conio.net/
ategon
質問者

お礼

Chaireさん、回答ありがとうございます。 addEventListener/attachEventでの登録を行っていますので、管理マネージャらしきものを作成しようと奮闘しているところです。 prototype.jsのソースも見てみましたが、ちょっと現状で自分には難解です(^^; ただ、リスナー登録と同時に登録情報を保存するという考え方は一緒のようなので、拙いながらも現状作成しているものでやってみようと思います。

その他の回答 (1)

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

追加 eventTarget.addEventListener('click', listener, false); // W3C standard eventTarget.attachEvent('onclick', listener); // IE ↓ 削除 eventTarget.removeEventListener('click', listener, false); // W3C standard eventTarget.detachEvent('onclick', listener); // IE # 現在 DOM2-Events を実装しているメジャーブラウザは Gecko 系,khtml 系,Opera 等。 もし eventTarget.onclick = function() { .. } のようなレガシーな書き方をしているなら // onclick の中から listener(..); の記述を取り除く eval("eventTarget.onclick = " + eventTarget.onclick.toString().replace(/listener\s*\([^)]*\)[;\s\n]*/, '')); # なお prototype.js でも IE メモリリーク対策で unload 時にリスナ破棄しているので参考にして下さい。

関連するQ&A

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

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

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

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

  • リスナについて

    Java を勉強している者です GUIライブラリである awt,swing のリスナについての質問です awt,swing では リスナというイベント処理用のクラスと処理内容を用意して その部品に、イベント用のリスナを登録することによって、コールバックする仕組みになっていると思います。 リスナとイベントの対応ですが、マウスリスナやキーリスナ、ボタンを押したときに対応するアクションリスナ などがありますが、多用する再描画に関しての paintListener がありません 再描画に対応する場合、常に部品を継承して、paintcomponent をオーバーライドして記述しなければなりません 再描画も重要なイベントだと思うのですがなぜリスナが用意されてないのか。 JFrame j = new JFrame(); j.addPaintListener( new PaintAdapter { void onPaint() { ... } } のように描画処理を後付できないかという質問です。 できるようならサンプルのコードを教えてください。 またpaintリスナが用意されない理由があればこれも教えていただけると幸いです。

    • ベストアンサー
    • Java
  • 親フレームからkeydownイベントの取得

    現在フレームで2分割にされたページを作成しています。 ページ全体でkeydownイベントを取得したいので、親フレームにkeydownイベント取得の処理は埋め込んだのですが、keydownイベントを取得できませんでした。 分割された子ページにそれぞれ処理を埋め込めばよいのでしょうが、諸事情により分割された片方のページにはjavascriptを埋め込めません(片方には埋め込み可です)。 このような状況で親フレームにてkeydownイベントを取得することは無理なのでしょうか? 動作自体が実現できるなら、必ずしも親フレームに処理を埋め込まなくてもいいです(埋め込める子ページに埋め込むなどなど)。

  • AS3でのマウスイベント受け渡しについて

    Actionscript3についての質問です。 どちらもSpriteクラスの親オブジェクトと子オブジェクトがあり、 ・MOUSE_OVERとMOUSE_OUTは親オブジェクトのイベントリスナーに処理をさせたい(子のaddやremoveを行うので)。 ・CLICKは子オブジェクトのリスナーに処理させたい。 という場合、どのように記述すればよいのでしょうか。 今のところ、子はmouseEnabledをfalseにして、親のクリックイベント処理でマウス座標からどの子がクリックされたのか(子は複数あります)を切り分ける方法しか思いつきません。 しかし、子が単純な形ではないのでこの方法では厳しいです。 他に何か良い方法は無いでしょうか。

    • ベストアンサー
    • Flash
  • 複数インスタンスに共通するイベント処理の方法

    こんにちは。 ActionScript3.0でサイト制作を行なっています。 マウスイベントのイベントリスナーを複数のボタンに登録する際に、 ループ処理によって登録できないか考えました。 例えば、 menu.buttonHome.addEventListener(MouseEvent.MOUSE_OVER, homeOver); menu.buttonAbout.addEventListener(MouseEvent.MOUSE_OVER, AboutOver); 上記は違うインスタンスにマウスオーバーのイベントを登録しておりますが、 記述にある「Home」「About」以外は全て共通の書式ですので、この部分だけ文字列を置き換えて処理できないでしょうか? 例えば、配列に「Home」「About」「Contact」のような文字列を格納し、上記イベントリスナーの指定の文字列だけを置き換えるという方法です。 また、上記のような文字列の置き換え以外にイベント処理の記述を簡略化する方法がありましたら是非ご教授ください。 宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • 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
  • イベントリスナーの部分を関数にしたい

    イベントリスナーの部分で、「load」以外に「change」も必要になったので関数にしたいのですが、 引数の関数の指定方法がわかりません。 どうすればいいのでしょうか。よろしくお願いします。 【イベントリスナーを関数にする前】 function hoge(){ this.view = function(){ var _this = this; window.addEventListener( 'load',function(){ _this.foo()}, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); 【やってみたこと】 function hoge(){ this.view = function(){ var _this = this; var func = function(){ _this.foo()}; this.addListener( 'window', 'load', func ); } this.addListener = function(elem,type,func){ elem.addEventListener( type,func, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view();

  • サブフォームのイベントを取得するには?

    同じソリューションにフォームA、フォームBがあり、フォームBは フォームAから起動されます。 フォームBがクローズした時、フォームAのメソッドを走らせたい のですが、その手段がわからず困っています。 別のフォームのイベントを取得する方法をご存知でしたら、 ご教授ください。 宜しくお願いします。

  • イベントリスナーに設定した関数内で、id属性の値を取得するには

    IEでイベントリスナーに設定した関数で、イベントを発生させた要素のid属性値を取得する方法が分からずに困っています。 記述したコードは下記のようになります。Firefoxではうまく動作しました。 clickHandler内でFirefoxのe.currentTarget.idに対応するような処理はどのように行えばよいでしょうか。 ------------ JavaScript部分 ----------------------- function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true; } else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r; } else { elm['on' + evType] = fn; } } function clickHandler(e) { var id; if (document.all && !window.opera) { // IEの場合に、ここの処理でid属性の属性地 hoge1やhoge2を取得したい。 // id = window.event.srcElement.id; これではだめ } else { id = e.currentTarget.id; } // idに応じた処理 } var elm1 = document.getElementById('hoge1'); var elm1 = document.getElementById('hoge2'); addEvent(elm1,'click',clickHandler,false); addEvent(elm2,'click',clickHandler,false); ------------ HTML部分 ----------------------- <li><a id="hoge1" href="#"><img src="●●" /></a></li> <li><a id="hoge2" href="#"><img src="●●" /></a></li> 先に進むことができずに困っています。よろしくお願いします。

専門家に質問してみよう