Trả lời

18

Chắc chắn, tôi cũng gặp một số vấn đề với điều này. Thuộc tính currentTarget là IEventListener bạn đã đăng ký trình xử lý sự kiện. Các target là một trong đó gửi sự kiện mà bạn đang xử lý. Vì vậy, các thay đổi currentTarget, các target không.

Kiểm tra các ví dụ sau:

mẫu App

<?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> 

Output

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 

Đó là một cây đơn giản của các đối tượng hiển thị, và khi ứng dụng đã sẵn sàng tôi :

  1. Thêm người nghe cho cùng một sự kiện trên mỗi thành phần trong cây.
  2. Gửi một sự kiện tùy ý (chỉ để trình diễn). Tôi đã chọn Event.COMPLETE.

Kể từ khi tất cả mọi thứ đã đăng ký eventHandler cho sự kiện đó giống nhau, và kể từ khi tôi đã thiết bubbles true (new Event(type, bubbles)), bất cứ điều gì trong cây, từ trẻ đến greatGrandParent và xa hơn nữa, đã đăng ký một event handler cho Event.COMPLETE, sẽ chạy phương thức đó: completeHandler. Sự kiện di chuyển lên chuỗi rồi quay xuống. Các target là một trong đó gửi đi sự kiện, vì vậy kể từ khi child gửi nó, nó phải là hằng số. currentTarget là những gì thay đổi.

Điều này có nghĩa là, giả sử bạn muốn kiểm tra thời điểm bạn đang di chuyển qua một DataGrid trong Flex, bạn muốn biết khi nào bạn cuộn qua hộp kiểm bên trong một trong những mụcRenderers trong DataGrid. Một cách là để thêmEventListener vào tất cả các hộp kiểm của ItemRenderer cho MouseEvent.ROLL_OVER. Một cách khác là để addEventListener để DataGrid bản thân cho MouseEvent.ROLL_OVER, và kiểm tra những gì mục tiêu là về sự kiện này:

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

Đó là cách tôi thường sử dụng event.target.

Hy vọng rằng sẽ giúp, Lance

Các vấn đề liên quan