2009-09-21 8 views
9

Existe-t-il un moyen de déterminer quels écouteurs d'événement sont enregistrés avec un objet d'affichage? Je souhaite supprimer tous les écouteurs d'événement d'un objet d'affichage afin que je puisse en attribuer de nouveaux en fonction des changements de contexte dans l'application.Comment supprimer tous les écouteurs d'événement d'un objet d'affichage?

+0

Fondamentalement dupe de celui-ci, connecté plus tôt aujourd'hui: http://stackoverflow.com/questions/1452539/flash-as3-eventdispatcher-any-way-of-getting -a-list-of-registered-listeners – Glenn

+2

Mais la réponse courte est que vous devez gérer votre propre en utilisant une carte de hachage ou quelque chose. – Glenn

Répondre

7

jeceuyper est juste ...

un côté pas cependant: DisplayObject étend EventDispatcher, qui ne déjà mettre en œuvre IEventDispatcher ... donc pour être plus précis: vous devez passer outre addEventListener et removeEventListener de garder une trace des auditeurs Quelques détails techniques: je vous suggère d'utiliser Dictionary pour stocker les fonctions du gestionnaire ... un peu plus lent pour l'insertion, mais beaucoup plus rapide pour le retrait ... aussi, Dictionary supporte les références faibles, ce qui est assez important dans le cas de la gestion des événements ... gardez également à l'esprit que useCapture permet d'ajouter le même gestionnaire deux fois ...

bonne chance alors ...;)

+0

Merci de l'avoir signalé sur back2dos! – jdecuyper

4

Glenn a raison, il n'existe pas de méthode removeAllListener ou listAllListener. Néanmoins, vous pourriez faire en sorte que votre custum diplayObject implémente l'interface IEventDispatcher et garder une trace de tous les écouteurs ajoutés ou supprimés de votre objet.

8

back2dos a mentionné l'approche que vous devez utiliser, ce que je faisais était étendre la classe MovieClip et mis en œuvre toutes sortes de fonctions que j'utilise tous les jours mais ne fais pas partie de la classe movieclip. y compris le remplacement de la classe 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

... à l'exception du fait d'incorporer le type dans la clé sans incorporer le pointeur de fonction, vous ne pouvez avoir qu'un seul écouteur d'un type donné sur l'objet. Pour autoriser plusieurs écouteurs, ajoutez le pointeur de la fonction d'écouteur à l'objet clé et définissez simplement cette clé sur une valeur fictive (par exemple, 1). –

2

C'est un peu un hack, mais dans certains (peut-être la plupart des cas), vous pouvez facilement définir l'objet d'affichage à null et ré-initialiser puis re-configurer avec zéro perturbation visuelle.

Ceci a l'avantage supplémentaire de supprimer tous les écouteurs d'événement.

À moins que vous ne le fassiez dans une application qui a déjà des centaines d'écouteurs et d'objets, cela devrait fonctionner parfaitement tant que vous pouvez tolérer la reconfiguration de votre objet d'affichage. De toute évidence, vous ne devriez pas faire cela sur quelque chose qui fait quelque chose de fou dans le constructeur comme le chargement de données.

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

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

travaux ...

+0

Lisez la question plus attentivement. J'ai demandé comment supprimer tous les écouteurs d'événement d'un objet. – Soviut

+0

En fait, je regardais seulement cette question pour résoudre ce problème. – andychase

+0

Cela ne fonctionnera pas - la fonction de gestion d'événement anonyme créée dans 'function b' est un objet différent de la fonction de gestionnaire d'événement anonyme créée dans' function a'. Par conséquent, l'appel 'removeEventListener' échouera silencieusement. – ericsoco

Questions connexes