2011-06-17 69 views
2

我有一個組件擴展了Flex的UIComponent,我想添加一個FlexMouseEvent.MOUSE_DOWN_OUTSIDE監聽器,但它不起作用。這意味着我無法捕捉到事件。但是,當我使用PopUpManager添加此組件,然後添加FlexMouseEvent.MOUSE_DOWN_OUTSIDE偵聽器時,它工作正常。FlexMouseEvent.MOUSE_DOWN_OUTSIDE僅適用於彈出組件?

FlexMouseEvent.MOUSE_DOWN_OUTSIDE僅適用於彈出組件嗎?

感謝您的幫助

+1

嗯,它是一個功能,允許關閉組件點擊外部組件。 – xwgou

回答

5

該事件僅通過彈出窗口觸發。如果您想檢查鼠標事件,則需要將常規鼠標添加到父容器,並檢查目標是否爲不是孩子。

另一種方法是通過捕獲舞臺上和組件上的事件......由於冒泡向上,組件點擊首先被捕獲。

public var bCompClicked=false; 

stage.addEventListener(MouseEvent.CLICK,onStageClick); 
myComponent.addEventListener(MouseEvent.CLICK,onComponentClick); 

private function onComponentClick(event:MouseEvent):void{ 
    bCompClicked = true; 
} 

private function onStageClick(event:MouseEvent):void{ 
    if(!bCompClicked){ //we didn't click the component, so we clicked outside it.. 
     clickedOutSide(); 
    }else{ 
     bCompClicked=false; //we did click the component, set to false for the next time. 
    } 
} 

private function clickedOutSide():void{ 
    //do what you want when someone clicks outside... 
} 

免責聲明我沒有測試過這種或想過這個問題很難...所以它可能無法正常工作。

+1

然而,這是一個很好的解決方案,而不是有2個事件監聽器,你可以在舞臺點擊處理器中檢查'event.target == this'。 –

+0

@J_A_X如果組件是由子控件組合的,這可能會變得複雜。所以我認爲原來的方法更好。 – splash

+0

@splash對,你可以聽到'event.currentTarget ==這個',它將返回事件監聽器所附的組件,即使它是該組件的子組件,也會被調用。 –

0

這是來自Jonathan的回答,只有一個處理程序,並負責照顧子組件(如果有的話)。

stage.addEventListener(MouseEvent.CLICK,onStageClick, false, 0, true); 

private function onStageClick(event:MouseEvent):void 
{ 
    var object:Object = event.target; 
    while (object && object != this && object.hasOwnProperty("parent")) { 
    object = object.parent; 
    } 
    if (object != this) { 
    // the click is not from this component or its children 
    } 
} 
相關問題