Comment puis-je obtenir jquery .val () APRES un événement de pression de touche?

101

J'ai eu:

$(someTextInputField).keypress(function() {
  alert($(this).val());
});

Maintenant, l'alerte renvoie toujours la valeur AVANT d'appuyer sur la touche (par exemple, le champ est vide, je tape «a» et l'alerte me donne «». Ensuite, je tape «b» et l'alerte me donne «a» ...). Mais je veux la valeur APRÈS la pression de la touche - comment puis-je faire cela?

Contexte: je souhaite activer un bouton dès que le champ de texte contient au moins un caractère. Je lance donc ce test sur chaque événement de pression de touche, mais en utilisant le val () retourné, le résultat est toujours un pas en arrière. L'utilisation de l'événement change () n'est pas une option pour moi car le bouton est désactivé jusqu'à ce que vous quittiez la zone de texte. S'il y a une meilleure façon de faire ça, je suis content de l'entendre!

Jörg Brenninkmeyer
la source
Le bouton doit-il être à nouveau désactivé si le texte est supprimé? Si tel est le cas, vous devrez probablement vous en tenir à une pression sur les touches.
Brilliand

Réponses:

152

Changer keypresspour keyup:

$(someTextInputField).on("keyup", function() {
  alert($(this).val());
});

keypressest déclenché lorsque la touche est enfoncée, keyupest déclenché lorsque la touche est relâchée.

Hourra je t'aide
la source
@Brilliand Vous avez raison. J'ai fait une solution de contournement pour cela, elle est publiée ci-dessous.
David Oliveros
7
comment accomplissez-vous cela sur les appareils iPhone / Android? Ils ne prennent pas en charge la fonction keyup.
Merijn Den Houting
4
la définition de la pression sur une touche n'est pas exactement correcte. c'est la définition de keydown. voir quirksmode.org/dom/events/keys.html
challet
59

Surpris que personne n'ait mentionné l'événement js "input":

$(someTextInputField).on('input', function() {
  alert($(this).val());
});

Conseillé.

https://developer.mozilla.org/en-US/docs/Web/Events/input

Billynoah
la source
8
Wow, c'est la réponse à plusieurs questions SO sans réponse / mal répondues.
Ben Racicot
4
Ceci est également idéal lorsque vous devez ignorer les touches fléchées, la touche Maj, etc. dans le champ de saisie.
hovado
2
caniuse.com/#search=input Support de navigateur relativement bon. Une bien meilleure réponse que d'écouter chaque keyup.
James Haug
1
Cela me sauve la journée! Je vous remercie. J'ai utilisé le code suivant: $ ('. Subject_mark'). On ("input", function () {var $ th = $ (this); $ th.val ($ th.val (). Replace (/ [^ 0-9] / g, function (str) {return '';}));
arsho
5

Vous pouvez également utiliser l'événement keydown avec un timeout de 0.

De cette façon, les modifications seront appliquées instantanément, au lieu d'être appliquées lorsque l'utilisateur cesse de maintenir la touche.

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});
David Oliveros
la source
Cela se comportera toujours de façon étrange dans le cas où vous maintenez la touche Backspace enfoncée ... peut-être que vous appuyez sur une touche avec un délai d'attente de 0?
Brilliand
Ah, peu importe, l'OP ne spécifie pas ce qui devrait se passer si le champ de texte est effacé.
Brilliand
4

Vous souhaiterez peut-être connecter un onchangegestionnaire d'événements au lieu d'utiliser l'un des événements clés.

$(someTextInputField).change(function() {
    alert($(this).val());
});

Utiliser Edit > Pasteou un clic droit puis coller déclenchera un événement de modification, mais pas un événement clé. Notez que certains navigateurs peuvent simuler un événement clé sur une pâte (bien que je n'en connaisse aucun) mais vous ne pouvez pas compter sur ce comportement.

Stephen P
la source
4

Essayez quelque chose comme ceci:

$('#someField').keypress(function() {
  setTimeout(function() {
    if ($('#someField').val().length > 0)
      $('#theButton').attr('disabled', false);
  }, 1);
});

Cela introduit simplement un délai d'expiration pour qu'après la fin de la boucle d'événement "keypress", votre code s'exécute presque immédiatement après. Un intervalle de minuterie aussi court (même s'il est arrondi par le navigateur) ne sera pas perceptible.

edit - ou vous pouvez utiliser "keyup" comme tout le monde le dit, bien que sa sémantique soit différente.

Pointu
la source
Ce n'est pas une question de benig smart . L'événement keyup ne fournit pas le même résultat. Vous obtenez des événements distincts pour shift, ctrl, etc. avec keyup - si vous voulez obtenir le caractère réel tapé (comme une esperluette) plutôt qu'une série d'événements clés que vous devez vérifier l'état des touches shift ou ctrl, appuyez sur la touche est la voie à suivre.
Ripside
1
Droite; c'est ce que je voulais dire par "sa sémantique est différente".
Pointy