flex中target和currenttarget有什么区别?

时间:2010-02-25 12:52:59

标签: actionscript-3 flex actionscript event-handling event-delegation

任何人都可以告诉我flex中的target和currenttarget之间的区别吗?

3 个答案:

答案 0 :(得分:18)

当然,我也遇到了一些问题。 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

这是一个简单的显示对象树,当应用程序准备就绪时我:

  1. 在树中的每个组件上添加同一事件的侦听器。
  2. 派遣任意事件(仅用于演示)。我选择了Event.COMPLETE
  3. 由于所有事件都为同一事件注册了一个eventHandler,并且因为我已将bubbles设置为true(new Event(type, bubbles)),所以树中的任何内容(从child到greatGrandParent及更高版本)都已注册Event.COMPLETE的事件处理程序将运行该方法:completeHandler。事件沿着链条向上移动然后向下移动。 target是调度事件的那个,所以自child调度它以来,它应该是常量。 currentTarget正在发生变化。

    这意味着,假设您要检查何时在Flex中滚动DataGrid,您想知道何时在DataGrid中的某个itemRenderer内滚动Checkbox。一种方法是在MouseEvent.ROLL_OVER的每个itemRenderer复选框上添加EventListener。另一种方法是将addEventListener添加到MouseEvent.ROLL_OVER的DataGrid本身,并检查 target 对事件的影响:

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

    我经常使用event.target

    希望有所帮助, 兰斯

答案 1 :(得分:1)

答案 2 :(得分:-9)

在询问此类问题之前,您应该浏览本网站上的教程:http://www.adobe.com/devnet/flex/videotraining/以获取Flex的介绍。您的问题将在第1天进行讨论。