2010-01-06 2 views
10
up.addEventListener(MouseEvent.CLICK, 
    function clickFunc(event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 
down.addEventListener(MouseEvent.CLICK, 
    function clickFunc(event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,-1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 

Le code ci-dessus ajoute un écouteur à un couple de MC. À l'origine, les méthodes étaient anonymes, mais je les ai nommées clickFunc() afin d'essayer de les référencer dans mon écouteur remove.supprime un écouteur qui a une fonction anonyme dans Actionscript 3

Voici mon code de suppression d'auditeur. Ces deux extraits sont dans des fonctions distinctes. La méthode add listener est appelée avant la méthode remove.

up.removeEventListener(MouseEvent.CLICK, clickFunc); 
down.removeEventListener(MouseEvent.CLICK, clickFunc); 

Dès que je publie le film je reçois cette erreur:

1120: Access of undefined property clickFunc. 

Répondre

0

essayez ceci:

up.addEventListener(MouseEvent.CLICK, 
    clickFunc = function(event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 

down.addEventListener(MouseEvent.CLICK, 
    clickFunc = function(event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,-1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 
+0

Je l'ai déjà essayé et produit une erreur "1120: Accès de la propriété indéfinie clickFunc" sur lui-même – ed209

2

Celui-ci devrait fonctionner ... il suffit de retirer le nom de Methode ...

up.addEventListener(MouseEvent.CLICK, 
     function(event:MouseEvent):void 
     { 
      revealSpinner(event,51.42,1,spinner); 
      event.currentTarget.removeEventListener(event.type, arguments.callee); 
      autoTimer.stop(); 
     }, 
     false, 0, true); 
    down.addEventListener(MouseEvent.CLICK, 
     function(event:MouseEvent):void 
     { 
      revealSpinner(event,51.42,-1,spinner); 
      event.currentTarget.removeEventListener(event.type, arguments.callee); 
      autoTimer.stop(); 
     }, 
     false, 0, true); 
+0

oui cela fonctionne, mais je dois supprimer l'écouteur d'événement de "haut" et "bas" peu importe celui sur lequel vous cliquez. Votre suggestion supprimerait le besoin d'appeler l'événement removeEventListener() car il fait partie de l'action CLICK. J'ai besoin de retirer l'écouteur de l'écouteur add. – ed209

+2

La seule façon que je peux penser est d'assigner les deux fonctions aux variables locales, les utiliser pour ajouter des écouteurs, et retourner ces deux vars comme un objet et stocker cet objet dans une variable globale. Maintenant, appelez remove listener des deux fonctions en utilisant 'globalObj.upFunction' et' globalObj.downFunction'. Mais avant de commencer à écrire le code pour cela, je vous suggère fortement d'utiliser des méthodes d'instance au lieu de fonctions anonymes/internes. – Amarghosh

5

Tout d'abord, vous avez le même nom utilisé deux fois (clickFunc), on ne peut déduire lequel vous vous référez dans vos appels à removeEventListener. Deuxièmement, clickFunc ne sera accessible que dans la fonction où elle est déclarée:

function foo() { 
    var clickFunc: Function; 
    up.addEventListener(MouseEvent.CLICK, 
     clickFunc = function (event:MouseEvent):void 
     { 
      revealSpinner(event,51.42,1,spinner); 
      event.currentTarget.removeEventListener(event.type, arguments.callee); 
      autoTimer.stop(); 
     }, 
     false, 0, true); 

    // 'clickFunc' available here, so this is possible: 
    up.removeEventListener(MouseEvent.CLICK, clickFunc); 
} 

function bar() { 
    // 'clickFunc' is not available here, so this is not possible: 
    up.removeEventListener(MouseEvent.CLICK, clickFunc); 
    // 1120: Access of undefined property clickFunc 
} 

Si vous avez besoin de référencer les méthodes (comme, par exemple, les retirer d'un événement), ils ne peuvent pas être anonymes. Si vous avez besoin de les référencer à partir de plusieurs méthodes, elles ne doivent pas être locales à une méthode (foo dans l'exemple ci-dessus). Et ils ont besoin d'identifiants différents (clickFunc1 et clickFunc2 si vous voulez). Ceci est ma solution proposée:

private function addHandlers(): void 
{ 
    up.addEventListener(MouseEvent.CLICK, upClickHandler, false, 0, true); 
    down.addEventListener(MouseEvent.CLICK, downClickHandler, false, 0, true); 
} 

private function removeHandlers(): void 
{ 
    up.removeEventListener(MouseEvent.CLICK, upClickHandler); 
    down.removeEventListener(MouseEvent.CLICK, downClickHandler); 
} 

private function upClickHandler(event:MouseEvent):void 
{ 
    revealSpinner(event,51.42,1,spinner); 
    event.currentTarget.removeEventListener(event.type, arguments.callee); 
    autoTimer.stop(); 
} 

private function downClickHandler(event:MouseEvent):void 
{ 
    revealSpinner(event,51.42,-1,spinner); 
    event.currentTarget.removeEventListener(event.type, arguments.callee); 
    autoTimer.stop(); 
} 

Bien sûr, si, comme dans votre exemple, les méthodes sont identiques, vous pouvez utiliser une seule:

private function addHandlers(): void 
{ 
    up.addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true); 
    down.addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true); 
} 

private function removeHandlers(): void 
{ 
    up.removeEventListener(MouseEvent.CLICK, clickHandler); 
    down.removeEventListener(MouseEvent.CLICK, clickHandler); 
} 

private function clickHandler(event:MouseEvent):void 
{ 
    revealSpinner(event,51.42,-1,spinner); 
    event.currentTarget.removeEventListener(event.type, arguments.callee); 
    autoTimer.stop(); 
} 
3

ok il y a quelques façons que vous pouvez faire ce. Voici la première façon dont je pense est ce que vous cherchez.

var upAnon:Function; 
var downAnon:Function; 

up.addEventListener(MouseEvent.CLICK, 
    upAnon = function (event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 
down.addEventListener(MouseEvent.CLICK, 
    downAnon = function (event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,-1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 

up.removeEventListener(MouseEvent.CLICK, upAnon); 
down.removeEventListener(MouseEvent.CLICK, downAnon); 

et voici une autre façon d'obtenir le même effet et la même fonctionnalité que le premier. juste plus propre et pratique habituellement standard.

function upFunction(event.MouseEvent):void { 
    revealSpinner(event,51.42,1,spinner); 
    event.currentTarget.removeEventListener(event.type, arguments.callee); 
    autoTimer.stop(); 
} 
function downFunction(event.MouseEvent):void { 
    revealSpinner(event,51.42,-1,spinner); 
    event.currentTarget.removeEventListener(event.type, arguments.callee); 
    autoTimer.stop(); 
} 

up.addEventListener(MouseEvent.CLICK, upFunction, false, 0, true); 
down.addEventListener(MouseEvent.CLICK, downFunction, false, 0, true); 

up.removeEventListener(MouseEvent.CLICK, upFunction); 
down.removeEventListener(MouseEvent.CLICK, downFunction); 

La raison pour laquelle vous devez utiliser le premier type, est de savoir si vous créez le eventHandler dans une fonction et que vous devez utiliser des variables définies dans cette fonction, à l'intérieur de votre fonction anonyme. par exemple, ici, j'accède au var countMe à l'intérieur de la fonction anon et l'incrémente sur mouse_down, et il s'incrémentera jusqu'à ce que mouse_up soit activé. donc à chaque fois que je clique, il va compter de 0 jusqu'à ce que la souris se lève, puis recommencera.

var anonFunc:Function; 

function doThisStuff(event:MouseEvent):void { 
    var countMe = 0; 

    stage.addEventListener(Event.ENTER_FRAME, 
     anonFunc = function (e:Event) { 
      countMe++; 
      trace(countMe); 
     } 
    ); 
} 

function stopCounting(event:MouseEvent):void { 
    stage.removeEventListener(Event.ENTER_FRAME, anonFunc); 
} 

stage.addEventListener(MouseEvent.MOUSE_DOWN, doThisStuff); 
stage.addEventListener(MouseEvent.MOUSE_UP, stopCounting); 
2

Vous créez les gestionnaires d'événements avec des références faibles (en passant true pour ce dernier paramètre). Comme vous le savez probablement déjà, une référence faible n'empêchera pas le garbage collector de collecter votre fonction. Cependant, sauf si vous conservez une référence à vos gestionnaires d'événements en dehors de la portée de la fonction dans laquelle vous les définissez (cela ne vous semble pas), les gestionnaires n'auront qu'une seule référence faible pour les maintenir en vie dès que le garbage collector fonctionne, vos gestionnaires sont partis quand même.L'essentiel est que vos gestionnaires d'événements n'ont pas l'air de se déclencher une fois que la collecte des ordures est en cours, donc il est inutile de s'inquiéter de la suppression des gestionnaires. Ils s'en iront tous seuls, que vous le vouliez ou non.

Vous devrez conserver une référence à ces gestionnaires d'événements dans une étendue qui existera quand ils doivent être déclenchés. Une fois que vous avez fait cela, vous devriez être capable d'utiliser ces références pour les supprimer.

Questions connexes