2009-09-21 13 views
9

表示オブジェクトに登録されているイベントリスナーを特定する方法はありますか?すべてのイベントリスナーを表示オブジェクトから削除して、アプリケーションのコンテキスト変更に基づいて新しいイベントリスナーを割り当てることができます。表示オブジェクトからすべてのイベントリスナーを削除するにはどうすればよいですか?

+0

基本的にはだまされやすい人は、先に今日ログイン:http://stackoverflow.com/questions/1452539/flash-as3-eventdispatcher-any-way-of-getting登録リストのリスト – Glenn

+2

しかし、簡単な答えは、あなた自身がハッシュマップなどを使って管理しなければならないということです。 – Glenn

答えて

7

jeceuyperは

側はないが...右です...

いくつかの技術的な詳細:私は挿入のため少し遅く...あなたはハンドラ関数を格納するのにDictionaryを使用することをお勧めが、はるかに速く除去するために...また、Dictionaryは非常に重要である、弱参照をサポートしていますイベント処理の場合でも...心に留めておいてください、useCaptureが、その後... ...二回

幸運を同じハンドラを追加することができます。

+0

back2dosを指摘してくれてありがとう! – jdecuyper

4

Glennが正しく、removeAllListenerメソッドやlistAllListenerメソッドなどはありません。 それにもかかわらず、あなたのdiplayObjectはIEventDispatcherインターフェイスを実装し、オブジェクトに追加または削除されたすべてのリスナーを追跡することができます。 DisplayObjectはとても正確には...すでにIEventDispatcherを実装しないEventDispatcherを拡張します:あなたがリスナーを追跡するためにaddEventListenerremoveEventListenerをオーバーライドする必要が

8

back2dosは、使用すべきアプローチを言及している)、私がやったことはMovieClipクラスを拡張したと機能のすべての種類を実装しました私は毎日使っていますが、ムービークリップクラスの一部ではありません。 addEventListenerをクラスのオーバーライド

protected var listeners : Dictionary = new Dictionary(); 
override public function addEventListener(type : String, listener : Function, useCapture : Boolean = false, priority : int = 0, useWeakReference : Boolean = true) : void 
{ 
     var key : Object = {type:type,useCapture:useCapture}; 
     if(listeners[ key ]) { 
       removeEventListener(type, listeners[ key ], useCapture); 
       listeners[ key ] = null; 
     } 
     listeners[ key ] = listener; 

     super.addEventListener(type, listener, useCapture, priority, useWeakReference); 
} 
protected function removeListeners() : void 
{ 
     try 
     { 
      for (var key:Object in listeners) { 
        removeEventListener(key.type, listeners[ key ], key.useCapture); 
         listeners[ key ] = null; 
      } 
     }catch(e:Error){} 
} 
+0

...関数ポインタを組み込むことなくキーに型を組み込むことを除けば、オブジェクト上に与えられた型のリスナーを1つだけ持つことができます。複数のリスナーを許可するには、リスナー関数ポインタをキーオブジェクトに追加し、そのキーを何らかのダミー値(1など)に設定するだけです。 –

2

含めこれはハックの一種が、いくつかの(おそらくほとんどの場合)であり、それは、あなたはそれをゼロにし、再初期化するために、表示オブジェクトを簡単に設定することができ、その後、再設定します視覚障害をゼロにします。

これには、すべてのイベントリスナーを削除する追加のボーナスがあります。

既に何百ものリスナーとオブジェクトがあるアプリでこれを行っているのでなければ、表示オブジェクトの再構成を許容できる限り、完全に正常に動作するはずです。

明らかに、データをロードするようなコンストラクタで何か狂ったことをしているものでは、この操作を行うべきではありません。

-1
function a(){ 
    mc.addEventListener(Event.ENTER_FRAME,function(){ 
         ... 
         } 
} 

function b(){ 
    mc.removeEventListener(Event.ENTER_FRAME,function(){}); 
} 

作品...この1の

+0

質問をより慎重に読んでください。私はオブジェクトからすべてのイベントリスナーを削除する方法を尋ねました。 – Soviut

+0

私は実際にこの問題を解決するためにこの質問を見ていました。 – andychase

+0

これは機能しません。 'function b'で作成された匿名イベントハンドラ関数は' function a'で作成された匿名イベントハンドラ関数とは別のオブジェクトです。したがって、 'removeEventListener'呼び出しは暗黙に失敗します。 – ericsoco

関連する問題