2008-11-12 54 views

回答

46

textInput僅在用戶有輸入文本進入控件時纔會被調度。另一方面,在用戶所做的每一次改變中都會發送一個change。例如,如果用戶刪除了部分文本,則只會分派change事件。

flash.events.TextEvent.TEXT_INPUT

這些都不當文本經由代碼改性分派

「時用戶類型,刪除或粘貼文本到 控制調度。」

(忽略詞 「刪除」 那裏 - 我只是嘗試它,此事件發貨時文本被用戶刪除)

flash.events.Event.CHANGE

「當通過用戶更改TextInput控件中的文本,如果您 使用數據綁定或ActionScript 輸入。不會發生此事件分派代碼更改文字。「

您還可以使用valueCommit事件,這是當用戶「提交」派出的變化(通常是通過從文本字段移動焦點的距離),但要記住,這個事件也時調度領域值以編程方式更改。

+2

非常感謝您的澄清答案。作爲一個方面說明:我做了一些測試,發現在訪問'textInput`事件的事件處理程序中的`text`屬性時(使用`event.currentTarget.text`),我得到的值反映了`觸發事件的按鍵上的文本。 – 2008-11-12 12:45:45

+0

對我來說這不是真的,至少在Flex 4.5中(我猜也是Flex 4)使用Spark TextInput。我得到change事件中的最後一個文本值,之前還有一個更改事件。 – Enrique 2011-06-25 00:02:31

3

這是一個很好的答案,hasseg。如果我有足夠的代表,我會投票。

根據您捕捉什麼用戶輸入,你可以繼承TextInput組件,並覆蓋變化和TextInput事件的內部監聽器。

我不知道是否有很多原因希望這樣做,但最近我做了一個處理OS X中導致粘貼換行符被表示爲'\ r'的錯誤,而不是'\ n'。

所有你需要做的就是添加以下你的超級後()調用你的子類對象的構造函數:

this.addEventListener(Event.CHANGE, textFieldChangeListener); 
this.addEventListener(TextEvent.TEXT_INPUT,textFieldInputListener); 

然後添加監聽器方法和要執行的代碼。

0

兩個Event.CHANGE和TextEvent.TEXT_INPUT事件觸發輸入的每個字符。如果您想要的事件只會觸發給定TextInput字段的單個時間,請使用FocusEvent.FOCUS_OUT

像Event.CHANGE和TextEvent,並將。TEXT_INPUT,這個事件只會觸發用戶輸入,而不是對該值進行編程修改。

+1

我意識到提交後認爲使用FOCUS_OUT並不是一種好方法,因爲雖然每個字段只觸發一次,但它並不會告訴您用戶是否更改了值。 – hrabinowitz 2011-06-01 17:09:20

0

CHANGE犯規告訴你什麼雖然已經改變 - TEXT_INPUTKEY_DOWN做。