我应该使用change
ortextInput
事件来捕获 TextInput 控件上的用户输入吗?为什么?
4 回答
textInput
仅当用户在控件中输入文本时才调度。change
另一方面,在用户提交的每一次更改上都会发送。因此,例如,如果用户删除了部分文本,则仅change
调度事件。
当通过代码修改文本时,这些都不会调度:
flash.events.TextEvent.TEXT_INPUT
:
“当用户在控件中键入、删除或粘贴文本时调度。”
(忽略那里的“删除”一词——我刚刚尝试过,当用户删除文本时不会调度此事件)
“当 TextInput 控件中的文本通过用户输入发生更改时调度。如果您使用数据绑定或 ActionScript 代码更改文本,则不会发生此事件。”
您也可以使用该valueCommit
事件,该事件在用户“提交”更改时调度(通常通过将焦点从文本字段移开),但请记住,当以编程方式更改字段值时也会调度此事件。
这是一个很好的答案,哈塞格。如果我有足够的代表,我会投票。
根据您捕获用户输入的目的,您可以子类化 TextInput 组件并覆盖更改和 textInput 事件的内部侦听器。
我不知道您是否有很多原因想要这样做,但我最近这样做是为了处理 OS X 中的一个错误,该错误导致粘贴的换行符表示为 '\r',而不是 '\ n'。
您需要做的就是在子类对象的构造函数中调用 super() 之后添加以下内容:
this.addEventListener(Event.CHANGE, textFieldChangeListener);
this.addEventListener(TextEvent.TEXT_INPUT,textFieldInputListener);
然后添加侦听器方法和要执行的代码。
Event.CHANGE 和 TextEvent.TEXT_INPUT 事件都会在每个键入的字符上触发。如果您想要一个仅针对给定 TextInput 字段触发一次的事件,请使用FocusEvent.FOCUS_OUT。
与 Event.CHANGE 和 TextEvent.TEXT_INPUT 一样,此事件只会在用户输入时触发,而不是在以编程方式更改值时触发。
CHANGE
虽然没有告诉你发生了什么TEXT_INPUT
变化 -并且KEY_DOWN
做。