我不明白它们之间的区别,它们看起来都一样,但我想它们不一样。
何时使用一个或另一个的任何示例将不胜感激。
我不明白它们之间的区别,它们看起来都一样,但我想它们不一样。
何时使用一个或另一个的任何示例将不胜感激。
Answers:
Ben的回答完全正确-因此请牢记他说的话。就是我要告诉你的是不是一个完整的解释,但它是一个非常简单的方法来记住如何e.target
,e.currentTarget
相对于鼠标事件,并显示列表中的工作:
e.target
=鼠标下的东西(如ben所说的...触发事件的东西)。
e.currentTarget
=点之前的东西...(见下文)
因此,如果您在一个实例名称为“ btns”的剪辑中有10个按钮,则可以执行以下操作:
btns.addEventListener(MouseEvent.MOUSE_OVER, onOver);
// btns = the thing before the dot of an addEventListener call
function onOver(e:MouseEvent):void{
trace(e.target.name, e.currentTarget.name);
}
e.target
将是10个按钮之一,e.currentTarget
并将始终是“ btns”剪辑。
值得一提的是,如果你改变了MouseEvent来一个ROLL_OVER或属性设置btns.mouseChildren
为false,e.target
并e.currentTarget
都将永远是“btns”。
currentTarget
对象始终在监听事件。target
是接收事件的实际目标。每次事件冒泡时,目标都会接收到事件并在显示列表中冒泡。(或者相反,用于事件捕获)
e.target
是触发事件分派器触发的原因,e.currentTarget
也是分配给侦听器的对象。
值得注意的是,event.target可能有用,例如,使用单个侦听器触发不同的动作。假设您有一个内部带有10个按钮的典型“菜单”子画面,所以不要这样做:
menu.button1.addEventListener(MouseEvent.CLICK, doAction1);
menu.button2.addEventListener(MouseEvent.CLICK, doAction2);
etc...
您可以简单地执行以下操作:
menu.addEventListener(MouseEvent.CLICK, doAction);
并根据event.target触发doAction(event)内的其他操作(使用其name属性等)。
e.currentTarget将始终返回添加了事件侦听器的组件。
另一方面,e.target可以是组件本身,也可以是接收事件的任何直接子代,孙代或孙子等等。换句话说,e.target返回位于“显示列表”层次结构顶部的组件,并且必须位于子层次结构或组件本身中。
一种用途是当您在Canvas中有多个Image且想要将Image拖动到组件内但Canvas内时。您可以在Canvas上添加一个侦听器,并且可以在该侦听器中编写以下代码,以确保不会拖动Canvas。
function dragImageOnly(e:MouseEvent):void
{
if(e.target==e.currentTarget)
{
return;
}
else
{
Image(e.target).startDrag();
}
}
target is the element that triggered the event (e.g., the user clicked on)
currenttarget is the element that the event listener is attached to.
如果单击按钮的子元素,则最好使用currentTarget来检测按钮属性,在CH中有时使用e.target可能会出现问题。
e.currentTarget是注册事件的element(parent),e.target是事件指向的node(children)。