Конечно, у меня тоже были проблемы с этим. Свойство currentTarget
- это IEventListener, для которого вы зарегистрировали обработчик событий. target
- это то, что отправило событие, которое вы обрабатываете в данный момент. Так что currentTarget
меняется, target
нет.
Посмотрите на следующий пример:
Пример приложения
<?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>
выход
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
Это простое дерево экранных объектов, и когда приложение готово, я:
- Добавить прослушиватели для одного и того же события в каждом компоненте дерева.
- Отправка произвольного события (только для демонстрации). Я выбрал
Event.COMPLETE
.
Поскольку все зарегистрировало eventHandler для того же события, и так как я установил bubbles
в true (new Event(type, bubbles)
), все в дереве, от дочернего до greatGrandParent и далее, зарегистрировало обработчик события для Event.COMPLETE
, запустит этот метод: completeHandler
. События движутся вверх по цепочке, а затем обратно вниз. target
- это то, что отправило событие, поэтому, поскольку child
отправило его, оно должно быть постоянным. currentTarget
- это то, что меняется.
Это означает, что, скажем, вы хотите проверить, когда вы переворачиваете DataGrid во Flex, вы хотите знать, когда вы переворачиваете флажок внутри одного из itemRenderers в DataGrid. Один из способов - добавитьEventListener на каждый флажок itemRenderer для MouseEvent.ROLL_OVER
. Другой способ - добавитьEventListener в сам DataGrid для MouseEvent.ROLL_OVER
и проверить, что является target для события:
protected function dataGrid_rollOverHandler(event:MouseEvent):void
{
// event.currentTarget is DataGrid
if (event.target is CheckBox)
trace("rolled over checkbox!");
}
Вот так я часто использую event.target
.
Надеюсь, это поможет,
Lance