¿Cómo puedo obtener jquery .val () DESPUÉS del evento de pulsación de tecla?

101

Tengo:

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

Ahora la alerta siempre devuelve el valor ANTES de presionar la tecla (por ejemplo, el campo está vacío, escribo 'a' y la alerta me da ''. Luego escribo 'b' y la alerta me da 'a' ...). Pero quiero el valor DESPUÉS de presionar la tecla, ¿cómo puedo hacer eso?

Fondo: me gustaría habilitar un botón tan pronto como el campo de texto contenga al menos un carácter. Entonces ejecuto esta prueba en cada evento de pulsación de tecla, pero usando el valor devuelto () el resultado siempre está un paso atrás. Usar el evento change () no es una opción para mí porque entonces el botón está deshabilitado hasta que salga del cuadro de texto. Si hay una mejor manera de hacerlo, ¡me alegra escucharlo!

Jörg Brenninkmeyer
fuente
¿Debería deshabilitarse el botón nuevamente si se elimina el texto? Si es así, probablemente tendrá que seguir presionando teclas.
Brilliand

Respuestas:

152

Cambiar keypressa keyup:

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

keypressse dispara cuando se presiona la tecla, keyupse dispara cuando se suelta la tecla.

Hurra, estoy ayudando
fuente
@Brilliand Tienes razón. Hice una solución para esto, se publica a continuación.
David Oliveros
7
¿Quién logra esto en dispositivos iPhone / Android? No admiten la función de teclado.
Merijn Den Houting
4
La definición de pulsación de tecla no es exactamente correcta. esa es la definición de keydown. ver quirksmode.org/dom/events/keys.html
challenge
59

Sorprendido de que nadie mencionó el evento js "input":

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

Recomendado.

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

Billynoah
fuente
8
Vaya, esta es la respuesta a varias preguntas SO sin respuesta / mal respondidas.
Ben Racicot
4
Esto también es excelente cuando necesita ignorar presionar las teclas de flecha, shift, etc. en el campo de entrada.
hovado
2
caniuse.com/#search=input Soporte de navegador relativamente bueno. Mucho mejor respuesta que escuchar cada tecla.
James Haug
1
¡Me salva el día! Gracias. Usé el siguiente código: $ ('. Subject_mark'). On ("input", function () {var $ th = $ (this); $ th.val ($ th.val (). Replace (/ [^ 0-9] / g, function (str) {return '';}));
arsho
5

Alternativamente, puede usar el evento keydown con un tiempo de espera de 0.

De esa manera, los cambios se aplicarán instantáneamente, en lugar de aplicarse cuando el usuario deje de presionar la tecla.

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});
David Oliveros
fuente
Esto todavía se comportará de manera extraña en el caso de mantener presionada la tecla Retroceso ... ¿quizás presionar una tecla con un tiempo de espera de 0?
Brilliand
Ah, no importa, el OP no especifica qué debería suceder si se borra el campo de texto.
Brilliand
4

Es posible que desee conectar un onchangecontrolador de eventos en lugar de utilizar cualquiera de los eventos clave.

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

Usar Edit > Pasteo un clic derecho y luego Pegar disparará un evento de cambio, pero no un evento clave. Tenga en cuenta que algunos navegadores pueden simular un evento clave en una pasta (aunque no conozco ninguno), pero no puede contar con ese comportamiento.

Stephen P
fuente
4

Intente algo como esto:

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

Eso simplemente introduce un tiempo de espera para que después de que se complete el ciclo de eventos de "pulsación de tecla", su código se ejecutará casi inmediatamente después. Un intervalo de tiempo tan corto (incluso si el navegador lo redondea) no se notará.

edit - o podría usar "keyup" como dicen todos los demás, aunque su semántica es diferente.

Puntiagudo
fuente
No es cuestión de ser inteligente . El evento keyup no proporciona el mismo resultado. Obtiene eventos distintos para shift, ctrl, etc.con keyup: si desea obtener el carácter real que se está escribiendo (como un ampersand) en lugar de una serie de eventos clave que debe verificar el estado de las teclas shift o ctrl, presione la tecla es el camino a seguir.
Ripside
1
Correcto; eso es lo que quise decir con "su semántica es diferente".
Puntiagudo