【问题标题】:Capturing user input from Flex TextInput control: which event to use?从 Flex TextInput 控件捕获用户输入:使用哪个事件?
【发布时间】:2010-09-21 23:04:03
【问题描述】:

我应该使用changetextInput 事件来捕获TextInput 控件上的用户输入吗?为什么?

【问题讨论】:

    标签: apache-flex events flex3 textinput


    【解决方案1】:

    textInput 仅在用户将文本输入 到控件中时调度。另一方面,change 在用户提交的每个更改上都被调度。因此,例如,如果用户删除了部分文本,则仅调度 change 事件。

    当通过代码修改文本时,这些都不会调度:

    flash.events.TextEvent.TEXT_INPUT:

    “当用户键入、删除或粘贴文本到 控制。”

    (忽略那里的“删除”一词——我刚刚尝试过,当用户删除文本时,这个事件调度)

    flash.events.Event.CHANGE:

    "当 TextInput 控件中的文本通过用户更改时调度 输入。 如果发生此事件,则不会发生 您使用数据绑定或 ActionScript 更改文本的代码。”

    您也可以使用valueCommit 事件,该事件在用户“提交”更改时调度(通常通过将焦点从文本字段移开),但请记住,当字段值为以编程方式更改。

    【讨论】:

    • 非常感谢您的澄清回答。附带说明:我做了一些测试,发现在访问textInput 事件的事件处理程序中的text 属性时(使用event.currentTarget.text),我得到的值反映了text 之前的值 触发事件的按键。
    • 这对我来说不是真的,至少在使用 spark TextInput 的 Flex 4.5(我猜也是 Flex 4)中不是这样。我得到了change事件中的最后一个文本值,之前也派发了一个changed事件。
    【解决方案2】:

    这是一个很好的答案,哈塞格。如果我有足够的代表,我会投票。

    根据您捕获用户输入的目的,您可以子类化 TextInput 组件并覆盖更改和 textInput 事件的内部侦听器。

    我不知道您是否有很多原因想要这样做,但我最近这样做是为了处理 OS X 中的一个错误,该错误导致粘贴的换行符被表示为“\r”,而不是'\n'。

    您需要做的就是在子类对象的构造函数中调用 super() 之后添加以下内容:

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

    然后添加监听方法和你要执行的代码。

    【讨论】:

      【解决方案3】:

      Event.CHANGE 和 TextEvent.TEXT_INPUT 事件都会在每个键入的字符上触发。如果您想要一个仅针对给定 TextInput 字段触发一次的事件,请使用 FocusEvent.FOCUS_OUT

      与 Event.CHANGE 和 TextEvent.TEXT_INPUT 一样,此事件只会在用户输入时触发,而不是对值的编程更改。

      【讨论】:

      • 我在提交后意识到使用 FOCUS_OUT 并不是一个好方法,因为虽然它确实每个字段只触发一次,但它不会告诉您用户是否更改了值。
      • 因此,正如上面的 hasseg 所指出的那样,CHANGE 似乎是聆听用户对 TextInput 字段进行更改的最佳整体选择。但是,如果用户键入 control-C 来复制字段值,这也会触发 CHANGE 事件。
      【解决方案4】:

      CHANGE 并没有告诉你 发生了什么 - TEXT_INPUTKEY_DOWN 确实发生了变化。

      【讨论】:

      • 但是,如果您需要将最终结果用于某事,则可以在处理 CHANGE 事件时从 TextInput 中获取整个文本。
      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2010-12-30
      • 1970-01-01
      相关资源
      最近更新 更多