2010-04-29 49 views
1

我遇到了一個問題,當用戶點擊ENTER並且焦點位於文本區域時,顯示AlertBox消息。彈出窗口可以正常工作,但是當用戶點擊進入警報時,按照預期關閉,但TextArea偵聽器從Alert中接收到ENTER事件並再次彈出對話框。我嘗試了很多方法來捕捉和吃這個事件,但到目前爲止我還沒有幸運。有沒有辦法做到這一點?在FLEX中,如何停止從啓動警報的控件捕獲我的警報的ENTER鍵?

public function init():void 
{ 
    myTextInput.addEventListener(KeyboardEvent.KEY_UP, handleKeyStrokes); 
} 

public function handleKeyStrokes(evt:KeyboardEvent):void 
{ 
    if(evt.keyCode == Keyboard.ENTER) 
    { 
     myAlert = Alert.show("This is a test and only a test", "Title", 4, null, alertCallBack); 
    } 
} 

<mx:TextInput id="myTextInput" 
       left="600" top="10"> 

</mx:TextInput> 
+0

作爲測試。我向AlertBox和TextField添加了一個KEY_UP和KEY_DOWN偵聽器。當我在文本字段中按焦點輸入Enter,然後在彈出警報後再次回車。該數字表示eventPhase。 文本輸入3的keyDown 紅色警戒3使用keyUp 警報3的keyDown 文本輸入3使用keyUp – WeeJavaDude 2010-04-30 01:43:49

回答

1

當您顯示警報時,請刪除文本偵聽器。在警報關閉時添加一個偵聽器,並在該偵聽器中重新添加文本偵聽器。

+0

我想,通過執行Alert.Show之前刪除聽衆和警報的回調函數添加監聽回來,我這樣做的時候該事件仍然達到了handleKeyStrokes。另一個奇怪的行爲是我試圖爲警報添加一個KEY_UP EventListener來捕獲ENTER鍵並且它似乎沒有觸發。應該是? – WeeJavaDude 2010-04-29 21:49:40

0

嘗試event.stopImmediatePropagationevent.preventDefault

+0

未嘗試preventDefault,但嘗試過stopImmediatePropagation並未成功。我正在努力解決的關鍵問題是Alert的源頭有一個Event listener,它正在查找ENTER鍵,所以不管怎樣我都需要在Alert點停止事件,或者能夠分辨出在完成ENTER之後在Alert中完成控制和ENTER。 我所看到的奇怪的事情是,如果我在警報上添加KEY_UP偵聽器,它在按下ENTER時不會觸發。 – WeeJavaDude 2010-04-30 01:15:28

1

看來,報警的是的closeEvent調用後,的KeyboardEvent與文本框的目標出動(如回車鍵來關閉警報)。

爲了解決這個問題,我確實喜歡前面提到的海報,並在顯示警報之前刪除了事件偵聽器,但之後我不是立即在CloseEvent函數中添加偵聽器,而是將它封裝在250ms超時。雖然這是一個糟糕的解決方案,但它工作。

wEmail.removeEventListener(KeyboardEvent.KEY_UP, AddEmail); 
Alert.show(
    "Email '" + wEmail.text + "' is not valid", 
    "Invalid Email", 
    Alert.OK, 
    Sprite(parentApplication), 
    function(e:CloseEvent):void { 
     //must delay adding because a second Keyboard.ENTER is 
     //dispatched after this function if enter was used to close Alert 
     setTimeout(function():void { 
      wEmail.addEventListener(KeyboardEvent.KEY_UP, AddEmail); 
     }, 250); 
    }, 
    null, 
    Alert.OK 
);