e.target和e.currentTarget之间的区别


276

我不明白它们之间的区别,它们看起来都一样,但我想它们不一样。

何时使用一个或另一个的任何示例将不胜感激。


2
这个小提琴非常清楚地表明了差异
Murhaf Sousli

1
有没有人足够了解ActionScript3,以确认其事件与DOM事件的行为相同?
Ben Creasy


Murhaf Sousli提供的参考是一个清晰的解释,回答了区别是什么。这个小提琴的简化版本将是最好的答案。
azakgaim

Answers:


204

Ben的回答完全正确-因此请牢记他说的话。就是我要告诉你的是不是一个完整的解释,但它是一个非常简单的方法来记住如何e.targete.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.targete.currentTarget都将永远是“btns”。


2
因此,换句话说,target是孩子,而currentTarget是容器。
Artemix 2011年

107
不,currentTarget对象始终在监听事件。target是接收事件的实际目标。每次事件冒泡时,目标都会接收到事件并在显示列表中冒泡。(或者相反,用于事件捕获)

4
如果是由孩子派遣的,则目标是孩子。通常,您将要使用e.currentTarget,因为这是您分配给侦听器的对象。但是在某些情况下(例如上面列出的一个Zevan),您希望一个容器上有多个子级的侦听器,然后使用e.target来查看哪个子级调度了该事件。
Ben Gale

来自@poke的评论是最佳答案“ currentTarget始终是侦听对象,target是接收事件的实际目标”
PandaWood '16


28

e.currentTarget始终是事件实际绑定的元素。e.target是事件起源的元素,因此e.target可以是的子元素e.currentTarget,也e.target可以是=== e.currentTarget,具体取决于标记的结构。



8

值得注意的是,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属性等)。


5

举个例子:

var body = document.body,
    btn = document.getElementById( 'id' );
body.addEventListener( 'click', function( event ) {
    console.log( event.currentTarget === body );
    console.log( event.target === btn );
}, false );

当您单击“ btn”时,将出现“ true”和“ true”!


3

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();
     }
}

3
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.

2
  • e.target是元素,您可以单击
  • e.currentTarget是添加了事件侦听器的元素。

如果单击按钮的子元素,则最好使用currentTarget来检测按钮属性,在CH中有时使用e.target可能会出现问题。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.