0

尽管阅读了许多关于 AS3 的文章并实际完成了现实世界的项目,但我仍然经常对简单的事件处理任务感到困惑。

在当前的 Flex 项目中,用户能够创建基于 BorderContainer 的自定义类的实例,然后选择并移动它们或调整它们的大小。我想添加一个事件侦听器来检测背景 BorderContainer(或舞台)上发生的鼠标点击,以便取消选择任何当前选择的实例。

有人可以概述完成此操作的步骤吗?我已经尝试了我能想到的一切(启用/禁用useCapture,尝试将 event.target 与 event.currentTarget 进行比较,尝试测试 eventPhase)。

我的项目太复杂而无法发布,但是通过下面的简单测试用例,我得到了以下输出,这对我来说毫无意义:结果是一样的。

所以我的问题是:如何检测仅在特定对象上发生的鼠标事件?

单击自定义 BorderContainer 的实例:

----------stage click 1
stage is TARGET 1
----------stage click 1
stage is TARGET 1
-----------background click 1
background is currentTarget 1
-----------background click 3
background is currentTarget 3
----------stage click 3
stage is TARGET 3
----------stage click 3
stage is TARGET 3

直接点击background

----------stage click 1
stage is TARGET 1
----------stage click 1
stage is TARGET 1
-----------background click 1
background is currentTarget 1
-----------background click 3
background is currentTarget 3
----------stage click 3
stage is TARGET 3
----------stage click 3
stage is TARGET 3

//-------------------

background.addEventListener(MouseEvent.CLICK, backgroundClick); 
background.addEventListener(MouseEvent.CLICK, backgroundClick, true); 
stage.addEventListener(MouseEvent.CLICK, stageClick); 
stage.addEventListener(MouseEvent.CLICK, stageClick, true);

protected function backgroundClick(event:MouseEvent):void {
    trace("-----------background click", event.eventPhase);  

    if (event.target == background){
        trace("background is TARGET",event.eventPhase);
    }

    if (event.currentTarget == background){
        trace("background is currentTarget",event.eventPhase);
    }
} 

protected function stageClick(event:MouseEvent):void {
    trace("----------stage click",event.eventPhase); 
    if (event.target == stage){
        trace("stage is currentTarget",event.eventPhase);
    }

    if (event.currentTarget == stage){
        trace("stage is TARGET",event.eventPhase);
    }
}
4

1 回答 1

0

点击事件气泡;这意味着除非你停止传播;层次结构中的每个组件,从事件被分派的点一直到舞台,都将在冒泡阶段接收到点击事件。在舞台上添加事件监听器将拾取应用程序中的每个点击事件;因为舞台是层次结构的顶层。

通常,您会将事件侦听器添加到 BorderContainer 的特定实例;不在舞台上。

有关事件如何在文档中使用的更多信息。

于 2012-10-13T22:15:40.397 回答