【问题标题】:prevent stage from receiving mouse events which occur on other objects?防止舞台接收发生在其他对象上的鼠标事件?
【发布时间】:2012-10-13 22:06:09
【问题描述】:

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

【问题讨论】:

    标签: actionscript-3 apache-flex


    【解决方案1】:

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

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

    docs 中有关事件如何处理的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2020-08-23
      相关资源
      最近更新 更多