Захват пользовательского ввода из Flex TextInput control: какое событие использовать?

Должен ли я использовать событие change или textInput для захвата ввода пользователем элемента управления TextInput? Почему?

Ответы

Ответ 1

textInput отправляется только тогда, когда пользователь вводит текст в элемент управления. change, с другой стороны, отправляется при каждом изменении, совершенном пользователем. Например, если пользователь удаляет часть текста, отправляется только событие change.

Ни один из них не отправляется, когда текст изменяется с помощью кода:

flash.events.TextEvent.TEXT_INPUT:

"Отправляется, когда пользователь создает, удаляет или вставляет текст в контроль".

(игнорируйте слово "удалить" там - я просто попробовал это, и это событие не отправляется, когда текст удаляется пользователем)

flash.events.Event.CHANGE:

"Отправляется, когда текст в элементе управления TextInput изменяется через пользователя вход. Это событие не возникает, если вы используете привязку данных или ActionScript код для изменения текста.

Вы также можете использовать событие valueCommit, которое отправляется, когда пользователь "совершает" изменения (обычно, перемещая фокус из текстового поля), но помните, что это событие также отправляется, когда значение поля изменяется программно.

Ответ 2

Это отличный ответ, hasseg. Если бы у меня было достаточно репутации, я бы проголосовал за нее.

В зависимости от того, для чего вы загружаете вход пользователя, вы можете подклассифицировать компонент TextInput и переопределить внутренние прослушиватели для событий change и 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, это событие будет запускаться только для ввода пользователем, а не для программных изменений значения.

Ответ 4

CHANGE не сообщает вам, что изменилось - TEXT_INPUT и KEY_DOWN do.