2012-10-13 33 views
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); 
    } 
} 

回答

0

點擊事件冒泡;這意味着除非你停止傳播;從事件分派到舞臺的階段,層次結構中的每個組件都將在泡泡階段接收點擊事件。在舞臺上添加事件監聽器會收集應用中的每一個點擊事件;因爲舞臺是層次結構的頂層。

通常你會事件偵聽器添加到您的使用BorderContainer一個具體實例;不在舞臺上。關於事件如何與docs工作

更多信息。