Actionscript 3 我需要帮助在AS3中启动一个事件

Actionscript 3 我需要帮助在AS3中启动一个事件,actionscript-3,events,event-handling,event-bubbling,Actionscript 3,Events,Event Handling,Event Bubbling,我想让类的父级先处理事件,然后让子级处理事件。有没有一种方法可以显式地使事件冒泡起来?我想这样做: ... this.addEventListener(MouseEvent.CLICK, characterClicked); ... private function characterClicked(e:Event):void{ // pass event to parent to be handled first ... } 这可能吗?如果可能,如何实现 我想出了一个办法。这似乎有点老套,

我想让类的父级先处理事件,然后让子级处理事件。有没有一种方法可以显式地使事件冒泡起来?我想这样做:

...
this.addEventListener(MouseEvent.CLICK, characterClicked);
...

private function characterClicked(e:Event):void{
// pass event to parent to be handled first
...
}

这可能吗?如果可能,如何实现

我想出了一个办法。这似乎有点老套,但它很管用。如果有更好的方法,请告诉我

...
this.addEventListener(MouseEvent.CLICK, characterClicked);
...

private function characterClicked(e:Event):void{
// pass event to parent to be handled first
this.removeEventListener(MouseEvent.CLICK, characterClicked); //prevent infinite loop
            dispatchEvent(e); // send event to parent object
            this.addEventListener(MouseEvent.CLICK, characterClicked);
            e.stopImmediatePropagation();
...
}

我想出了一个办法。这似乎有点老套,但它很管用。如果有更好的方法,请告诉我

...
this.addEventListener(MouseEvent.CLICK, characterClicked);
...

private function characterClicked(e:Event):void{
// pass event to parent to be handled first
this.removeEventListener(MouseEvent.CLICK, characterClicked); //prevent infinite loop
            dispatchEvent(e); // send event to parent object
            this.addEventListener(MouseEvent.CLICK, characterClicked);
            e.stopImmediatePropagation();
...
}

如果要在父对象而不是子对象中处理侦听器,可能会更容易。完成后,您可以将事件传递给孩子:

// inside parent class:
childObj.addEventListener(MouseEvent.CLICK, onCharacterClicked);

private function onCharacterClicked(e:Event):void {
    // do parent stuff first
    // ...

    // then pass event to child 
    childObj.onCharacterClicked(e);
}

如果要在父对象而不是子对象中处理侦听器,可能会更容易。完成后,您可以将事件传递给孩子:

// inside parent class:
childObj.addEventListener(MouseEvent.CLICK, onCharacterClicked);

private function onCharacterClicked(e:Event):void {
    // do parent stuff first
    // ...

    // then pass event to child 
    childObj.onCharacterClicked(e);
}
事件有三个“阶段”。它们按此顺序发生,这意味着如果将事件侦听器设置为处于捕获阶段,它将始终在一个设置之前定期触发(这意味着在目标或气泡处)

像这样:

// in parent, third argument is "use capture"
child.addEventListener(MouseEvent.CLICK, handleClickInParent, true); 

// in child, add listener as usual
addEventListener(MouseEvent.CLICK, handleClick);
现在,您的父事件侦听器将始终首先启动

事件有三个“阶段”。它们按此顺序发生,这意味着如果将事件侦听器设置为处于捕获阶段,它将始终在一个设置之前定期触发(这意味着在目标或气泡处)

像这样:

// in parent, third argument is "use capture"
child.addEventListener(MouseEvent.CLICK, handleClickInParent, true); 

// in child, add listener as usual
addEventListener(MouseEvent.CLICK, handleClick);

现在,您的父事件侦听器将始终首先启动

object1添加object2。对象2被单击。Object2将首先获取事件。我希望object2将事件冒泡到object1,然后处理该事件。object1添加object2。对象2被单击。Object2将首先获取事件。我希望object2将事件冒泡到object1,然后处理该事件。谢谢,但这不起作用。我正在编写一个类,我无法控制父容器将是什么。这必须在子对象中完成。谢谢,但这不起作用。我正在编写一个类,我无法控制父容器将是什么。这必须在子对象中完成。感谢+1提供了一个有效的解决方案。我仍在寻找从子对象中执行此操作的方法。我不会总是编写使用这个类的代码(因此我不能像您的示例中那样依赖其他程序员将第三个参数设置为true)。你知道从孩子身上做这件事的方法吗?如果你解释为什么你需要这样做,我可能会想出一些办法。简言之,程序中使用了一个全局布尔标志。单击的某些对象将导致打开标志,单击的某些对象将关闭标志(以及其他操作)。当我的角色被点击时,我需要打开标志(不管它的父母是谁)。因此,我需要确保我的父母做了它需要做的事情,然后我可以打开这个标志并做角色需要做的其他事情。谢谢,+1提供了一个有效的解决方案。我仍在寻找从子对象中执行此操作的方法。我不会总是编写使用这个类的代码(因此我不能像您的示例中那样依赖其他程序员将第三个参数设置为true)。你知道从孩子身上做这件事的方法吗?如果你解释为什么你需要这样做,我可能会想出一些办法。简言之,程序中使用了一个全局布尔标志。单击的某些对象将导致打开标志,单击的某些对象将关闭标志(以及其他操作)。当我的角色被点击时,我需要打开标志(不管它的父母是谁)。因此,我需要确保我的父级执行它需要执行的操作,然后我可以打开此标志并执行角色需要执行的其他操作。您不必显式地重新修补事件以捕获父级中的事件。在您的情况下,我会在父级中添加一个事件侦听器,在父级中处理该事件,一旦父级完成事件处理,我会在子级上调用一个函数。这是假设每个父母只有一个孩子。谢谢你的建议。我需要在子类中处理这个问题,而不是在父类中。父容器代码不应更改。不必显式重新修补事件以捕获父容器中的事件。在您的情况下,我会在父级中添加一个事件侦听器,在父级中处理该事件,一旦父级完成事件处理,我会在子级上调用一个函数。这是假设每个父母只有一个孩子。谢谢你的建议。我需要在子类中处理这个问题,而不是在父类中。父容器代码不应更改。