0

我今天在编码时发现了一些奇怪的东西。我找不到今天发生在我身上的事情的解释。

我已经创建了按钮并向其添加事件侦听器。

private function drawButtons():void{
        survivorModeBtn = new SurvivorModeBtn();    
        trace("I registered Event Listener with button here");
        survivorModeBtn.addEventListener(MouseEvent.CLICK,onSurvivorModeBtnClick);
        addChild(survivorModeBtn);
}

private function onSurvivorModeBtnClick(e:MouseEvent):void{
        trace("I clicked on btn here");
        //I will dispatch event here which runs second part of code
        mainMenuViewEvent = new MainMenuViewEvent("onSurvivorModeIsClicked");
        hideButtons();
        dispatchEvent(mainMenuViewEvent);
}

Dispatched 事件将运行这些代码部分:

public function createClickToStart():void{
        trace("here I register event listener MouseEvent.Click");
        stage.addEventListener(MouseEvent.CLICK,onClick);
    }

private function onClick(e:MouseEvent):void{
        trace("onClick()");
    }

当我运行我的程序并单击第一个按钮时。我在控制台中得到了这个输出:

我在这里用按钮注册了事件监听器 我在这里点击了 btn 我在这里注册了事件监听器 MouseEvent.Click onClick()

我不明白我怎么能看到“onClick()”消息,如果我只点击第一个按钮,即使在那个时候也没有用 CLICK 事件重新注册。

感谢您解决我的问题。

4

1 回答 1

1

你经历了所谓的“冒泡”事件。首先,“click”事件被调度到光标下最顶层的对象,然后它通过父引用一直向上提升到舞台,如果你不强制它到e.stopPropagation(). 因此,当在 内解析事件时survivorModeBtn,它还没有到达阶段,同时您为此类事件指定阶段侦听器。然后它冒泡并进入舞台,舞台说“哇,我注册了一个 MouseEvent.CLICK 监听器,我们现在就调用它!” 并调用onClick()函数,使您收到最后的跟踪结果。

于 2012-11-07T12:36:08.420 回答