【问题标题】:I need help bubbling an event in AS3我需要帮助在 AS3 中冒泡事件
【发布时间】:2012-01-22 18:17:50
【问题描述】:

我想让我的班级的父母先处理事件,然后我想让孩子处理事件。有没有办法明确地将事件冒泡?我想做这样的事情:

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

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

这可能吗?如果可以,怎么做?

【问题讨论】:

  • object1 添加 object2。 object2 被点击。 Object2 将首先获取事件。我想让object2将事件冒泡到object1,然后处理事件。

标签: actionscript-3 events event-handling event-bubbling


【解决方案1】:

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

像这样:

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

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

现在,您的父事件侦听器将始终首先触发!

【讨论】:

  • 谢谢,+1 的解决方案。我仍在寻找一种从子对象中执行此操作的方法。我不会总是编写使用此类的代码(因此我不能依赖其他程序员将第三个参数设置为 true,如您的示例中所示)。你知道从孩子身上做这件事的方法吗?
  • 如果您解释为什么需要这样做,我可能会想出一些办法。
  • 简而言之,程序中使用了一个全局布尔标志。单击某些对象将导致打开标志,单击某些对象会关闭标志(以及其他操作)。当我的角色被点击时,我需要打开标志(无论它的父母是谁)。所以,我需要确保我的父母做了它需要做的事情,然后我可以打开这个标志并做角色需要做的其他事情。
【解决方案2】:

我想出了一个办法。看起来很骇人听闻,但它确实有效。如果有更好的方法,请告诉我。

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

【讨论】:

  • 您不必显式地重新调度事件以在父级中捕获事件。在您的情况下,我会在父级中添加一个事件侦听器,在父级中处理事件,一旦父级完成事件处理,我会在子级上调用一个函数。这是假设每个父母只有 1 个孩子。
  • 感谢您的建议。我需要在子类中处理这个,而不是在父类中。父容器代码不应更改。
【解决方案3】:

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

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

【讨论】:

  • 谢谢,但这行不通。我正在写一个类,我无法控制父容器是什么。这必须在子对象中完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多