【发布时间】:2010-09-21 23:04:03
【问题描述】:
我应该使用change 或textInput 事件来捕获TextInput 控件上的用户输入吗?为什么?
【问题讨论】:
标签: apache-flex events flex3 textinput
我应该使用change 或textInput 事件来捕获TextInput 控件上的用户输入吗?为什么?
【问题讨论】:
标签: apache-flex events flex3 textinput
textInput 仅在用户将文本输入 到控件中时调度。另一方面,change 在用户提交的每个更改上都被调度。因此,例如,如果用户删除了部分文本,则仅调度 change 事件。
当通过代码修改文本时,这些都不会调度:
flash.events.TextEvent.TEXT_INPUT:
“当用户键入、删除或粘贴文本到 控制。”
(忽略那里的“删除”一词——我刚刚尝试过,当用户删除文本时,这个事件不调度)
"当 TextInput 控件中的文本通过用户更改时调度 输入。 如果发生此事件,则不会发生 您使用数据绑定或 ActionScript 更改文本的代码。”
您也可以使用valueCommit 事件,该事件在用户“提交”更改时调度(通常通过将焦点从文本字段移开),但请记住,当字段值为以编程方式更改。
【讨论】:
textInput 事件的事件处理程序中的text 属性时(使用event.currentTarget.text),我得到的值反映了text 之前的值 触发事件的按键。
这是一个很好的答案,哈塞格。如果我有足够的代表,我会投票。
根据您捕获用户输入的目的,您可以子类化 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 确实发生了变化。
【讨论】: