Répondre

18

Bien sûr, j'ai eu quelques problèmes avec cela aussi. La propriété currentTarget est le IEventListener pour lequel vous avez enregistré le gestionnaire d'événements. Le target est celui qui a distribué l'événement que vous gérez actuellement. Donc, les changements currentTarget, le target ne fait pas.

Découvrez l'exemple suivant:

App échantillon

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    creationComplete="addListeners()"> 

    <mx:Script> 
     <![CDATA[ 

      protected function addListeners():void 
      { 
       greatGrandParent.addEventListener(Event.COMPLETE, completeHandler); 
       grandParent.addEventListener(Event.COMPLETE, completeHandler); 
       aParent.addEventListener(Event.COMPLETE, completeHandler); 
       child.addEventListener(Event.COMPLETE, completeHandler); 
       // dispatch event that "bubbles", second param is "true" 
       // dispatched from child 
       child.dispatchEvent(new Event(Event.COMPLETE, true)); 
      } 

      protected function completeHandler(event:Event):void 
      { 
       trace("target: ", event.target + ", currentTarget: ", event.currentTarget); 
      } 

     ]]> 
    </mx:Script> 

    <mx:Panel id="greatGrandParent"> 
     <mx:Panel id="grandParent"> 
      <mx:Panel id="aParent"> 
       <mx:Button id="child"/> 
      </mx:Panel> 
     </mx:Panel> 
    </mx:Panel> 

</mx:Application> 

Sortie

target: MyApp.greatGrandParent.grandParent.aParent.child, currentTarget: MyApp.greatGrandParent.grandParent.aParent.child 
target: MyApp.greatGrandParent.grandParent.aParent.child, currentTarget: MyApp.greatGrandParent.grandParent.aParent 
target: MyApp.greatGrandParent.grandParent.aParent.child, currentTarget: MyApp.greatGrandParent.grandParent 
target: MyApp.greatGrandParent.grandParent.aParent.child, currentTarget: MyApp.greatGrandParent 

C'est un arbre simple des objets d'affichage, et lorsque l'application est prêt, je :

  1. Ajoutez des écouteurs pour le même événement sur chaque composant de l'arborescence.
  2. Envoie un événement arbitraire (juste pour la démonstration). J'ai choisi Event.COMPLETE.

Puisque tout a enregistré une eventHandler pour ce même événement, et comme je l'ai mis bubbles true (new Event(type, bubbles)), quoi que ce soit dans l'arbre, de l'enfant à greatGrandParent et au-delà, qui a enregistré un gestionnaire d'événements pour Event.COMPLETE, exécutera cette méthode: completeHandler. Les événements remontent la chaîne puis redescendent. Le target est celui qui a envoyé l'événement, donc depuis child l'a envoyé, il devrait être constant. Le currentTarget est ce qui change. Cela signifie que, par exemple, si vous voulez vérifier quand vous faites un survol d'un DataGrid dans Flex, vous voulez savoir quand vous survolez une Checkbox dans l'un des itemRenderers dans le DataGrid. Une façon consiste à ajouter EventListener sur chaque case de itemRenderer pour MouseEvent.ROLL_OVER. Une autre façon est de addEventListener au DataGrid lui-même pour MouseEvent.ROLL_OVER et vérifier ce que l'cible est sur l'événement:

protected function dataGrid_rollOverHandler(event:MouseEvent):void 
{ 
    // event.currentTarget is DataGrid 
    if (event.target is CheckBox) 
     trace("rolled over checkbox!"); 
} 

Voilà comment j'utilise souvent event.target.

espoir qui aide, Lance