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?
Répondre
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 ...;)
Merci de l'avoir signalé sur back2dos! – jdecuyper
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.
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){}
}
... à 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). –
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.
function a(){
mc.addEventListener(Event.ENTER_FRAME,function(){
...
}
}
function b(){
mc.removeEventListener(Event.ENTER_FRAME,function(){});
}
travaux ...
Lisez la question plus attentivement. J'ai demandé comment supprimer tous les écouteurs d'événement d'un objet. – Soviut
En fait, je regardais seulement cette question pour résoudre ce problème. – andychase
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
- 1. socket.SO_REUSEADDR: paquets reçus par tous les nouveaux écouteurs
- 2. Comment supprimer tous les caractères d'une chaîne
- 3. Comment supprimer tous les sujets dans ActiveMQ?
- 4. flash AS3 comment puis-je supprimer les écouteurs d'événements de scène
- 5. Comment supprimer tous les éléments d'un NSTableView contrôlé par NSArrayController?
- 6. Supprimer tous les enregistrements d'une table
- 7. Supprimer tous les fichiers de svn repository
- 8. Problème avec les écouteurs d'événements
- 9. Flex/AS3: Quand faut-il retirer les écouteurs?
- 10. Comment supprimer tous les sauts de ligne? Je
- 11. Comment supprimer tous les gestionnaires d'événements Click dans Jquery
- 12. Comment supprimer tous les TEXT/Numbers entre (et) dans sqlite3?
- 13. Les écouteurs d'événements javascript doivent-ils être supprimés avant de supprimer l'élément auquel ils sont attachés?
- 14. Comment supprimer un objet enfant dans NHibernate?
- 15. Comment trouver tous les champs publics d'un objet en C#?
- 16. Existe-t-il un moyen de supprimer les écouteurs d'événements inconnus des objets?
- 17. Cron Job - Commande pour supprimer tous les fichiers .flv tous les jours
- 18. Java regex pour supprimer tous les numéros de fin?
- 19. jQuery Supprimer simultanément une classe CSS de tous les descendants
- 20. Supprimer tous les e-mails dans une application Highrise
- 21. Comment déterminer l'ordre des écouteurs dans web.xml
- 22. Supprimer tous les caractères non-ASCII de la chaîne
- 23. Supprimer tous les éléments à l'application à proximité dans ASP.Net
- 24. Supprimer tous les cookies visibles déclenche une exception
- 25. Supprimer tous les fichiers dans un répertoire vb6
- 26. Cocoa-Touch, Core Data: Comment supprimer tous les objets pour une entité?
- 27. Comment supprimer efficacement tous les x enfants de l'entité parent sauf les derniers en utilisant NHibernate?
- 28. Comment puis-je supprimer tous les caractères autres que les mots, sauf le saut de ligne?
- 29. Comment supprimer les validations?
- 30. Comment désactiver tous les hôtes virtuels apache?
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
Mais la réponse courte est que vous devez gérer votre propre en utilisant une carte de hachage ou quelque chose. – Glenn