2008-11-12 5 views

Répondre

46

textInput est envoyé uniquement lorsque l'utilisateur a entrée le texte dans le contrôle. change, d'autre part, est distribué à chaque changement commis par l'utilisateur. Par exemple, si l'utilisateur supprime une partie du texte, seul l'événement change est distribué.

Aucun de ceux-ci est transmis lorsque le texte est modifié via le code:

flash.events.TextEvent.TEXT_INPUT:

"Distribué lorsque l'utilisateur types, efface le texte ou les pâtes dans le contrôle ."

(ignorer le mot "supprimer" là - je viens d'essayer et cet événement est pas envoyé lorsque le texte est supprimé par l'utilisateur)

flash.events.Event.CHANGE:

«Distribué lorsque le texte du contrôle TextInput change via l'entrée de l'utilisateur Cet événement ne se produit pas si vous utilisez la liaison de données ou ActionScript code pour changer le texte. "

Vous pouvez également utiliser l'événement valueCommit, qui est distribué lorsque l'utilisateur « engage » les changements (habituellement en déplaçant l'accent mis sur le champ de texte), mais rappelez-vous que cet événement est également distribué lorsque le champ La valeur est modifiée par programme.

+2

Merci beaucoup pour la réponse de clarification. En note: j'ai fait quelques tests et j'ai trouvé que lorsque j'accédais à la propriété 'text' dans le gestionnaire d'événements pour l'événement' textInput' (en utilisant 'event.currentTarget.text'), la valeur que j'obtiens reflète la valeur de' text' _before_ la touche qui a déclenché l'événement. –

+0

Ce n'est pas vrai pour moi, du moins pas dans Flex 4.5 (je suppose que Flex 4 aussi) en utilisant spark TextInput. Je reçois la dernière valeur de texte dans l'événement change, il y a aussi un événement changeant distribué avant. – Enrique

3

C'est une bonne réponse, hasseg. Si j'avais assez de représentant, je le voterais. En fonction de ce pour quoi vous saisissez l'entrée utilisateur, vous pouvez sous-classer le composant TextInput et remplacer les écouteurs internes pour les événements change et textInput. Je ne sais pas s'il y a beaucoup de raisons que vous voudriez faire ceci, mais je l'ai fait récemment pour traiter un bogue dans OS X qui fait que les sauts de ligne collés soient représentés comme '\ r', au lieu de '\ n'.

Tout ce que vous devez faire est d'ajouter ce qui suit après votre appel super() dans le constructeur de votre objet sous-classé:

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

Et puis ajoutez les méthodes d'écoute et le code que vous voulez exécuter.

0

Les événements Event.CHANGE et TextEvent.TEXT_INPUT déclenchent chaque caractère typé. Si vous voulez un événement qui ne déclenchera qu'une seule fois pour un champ TextInput donné, utilisez FocusEvent.FOCUS_OUT.

Comme Event.CHANGE et TextEvent.TEXT_INPUT, cet événement se déclenchera uniquement pour l'entrée utilisateur, pas pour les modifications programmatiques de la valeur.

+1

J'ai réalisé après avoir soumis cela que l'utilisation de FOCUS_OUT n'est pas une bonne approche car, s'il est vrai qu'elle n'est déclenchée qu'une fois par champ, elle ne dit rien sur le fait que l'utilisateur a changé la valeur ou non. – hrabinowitz

+0

Il semble donc, comme précédemment mentionné, que CHANGE soit le meilleur choix global à écouter pour les changements d'utilisateur dans un champ TextInput. Toutefois, si l'utilisateur tape control-C pour copier une valeur de champ, cela déclenchera également un événement CHANGE. – hrabinowitz

0

CHANGE ne marche pas vous dire ce que a bien changé - TEXT_INPUT et KEY_DOWN faire.

+0

Vous pouvez toutefois récupérer l'intégralité du texte à partir de TextInput lors du traitement de l'événement CHANGE si vous devez utiliser le résultat final pour quelque chose. –

Questions connexes