防止阶段接收其他对象上发生的鼠标事件?

时间:2012-10-13 22:06:10

标签: actionscript-3 flex

尽管阅读了很多关于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);
    }
}

1 个答案:

答案 0 :(得分:0)

点击活动泡泡;这意味着除非你停止传播;层次结构中的每个组件(从事件一直调度到阶段的那一点)将在泡沫阶段接收点击事件。在舞台上添加事件侦听器将获取应用程序中的每个单击事件;因为舞台是层次结构的顶层。

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

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