Come posso ottenere jquery .val () DOPO un evento di pressione dei tasti?


101

Ho ottenuto:

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

Ora l'avviso restituisce sempre il valore PRIMA della pressione del tasto (es. Il campo è vuoto, digito "a" e l'avviso mi dà "". Quindi digito "b" e l'avviso mi dà "a" ...). Ma voglio il valore DOPO la pressione del tasto - come posso farlo?

Sfondo: vorrei abilitare un pulsante non appena il campo di testo contiene almeno un carattere. Quindi eseguo questo test su ogni evento di pressione dei tasti, ma usando il val () restituito il risultato è sempre un passo indietro. L'utilizzo dell'evento change () non è un'opzione per me perché quindi il pulsante è disabilitato fino a quando non esci dalla casella di testo. Se c'è un modo migliore per farlo, sono felice di sentirlo!


Il pulsante deve essere nuovamente disabilitato se il testo viene eliminato? Se è così, probabilmente dovrai restare con la pressione dei tasti.
Brilliand

Risposte:


152

Cambia keypressin keyup:

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

keypressviene attivato quando il tasto viene premuto, keyupviene attivato quando il tasto viene rilasciato.


@Brilliand hai ragione. Ho fatto una soluzione alternativa per questo, è pubblicato di seguito.
David Oliveros

7
come chi lo fa su dispositivi iPhone / Android? Non supportano la funzione keyup.
Merijn Den Houting

4
la definizione di pressione dei tasti non è esattamente corretta. questa è la definizione di keydown. vedi quirksmode.org/dom/events/keys.html
challet

59

Sorpreso dal fatto che nessuno abbia menzionato l'evento "input" js:

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

Consigliato.

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


8
Wow, questa è la risposta a diverse domande SO senza risposta / con risposta errata.
Ben Racicot

4
Questo è ottimo anche quando è necessario ignorare la pressione dei tasti freccia, MAIUSC ecc. Nel campo di input.
hovado

2
caniuse.com/#search=input Supporto browser relativamente buono. Risposta molto migliore che ascoltare ogni keyup.
James Haug

1
Mi salva la giornata! Grazie. Ho usato il seguente codice: $ ('. Subject_mark'). On ("input", function () {var $ th = $ (this); $ th.val ($ th.val (). Replace (/ [^ 0-9] / g, function (str) {return '';}));
arsho


5

In alternativa, puoi utilizzare l'evento keydown con un timeout pari a 0.

In questo modo, le modifiche verranno applicate immediatamente, invece di essere applicate quando l'utente smette di tenere premuto il tasto.

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});

Questo si comporterà comunque in modo strano se si tiene premuto Backspace ... forse la pressione del tasto con un timeout di 0?
Brilliand

Ah, non importa, l'OP non specifica cosa dovrebbe accadere se il campo di testo viene cancellato.
Brilliand

4

Potresti voler collegare un onchangegestore di eventi invece di utilizzare uno qualsiasi degli eventi chiave.

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

Utilizzando Edit > Pasteo un clic con il pulsante destro del mouse e poi Incolla, verrà attivato un evento di modifica, ma non un evento chiave. Nota che alcuni browser potrebbero simulare un evento chiave su una pasta (anche se non ne conosco nessuno) ma non puoi contare su quel comportamento.


4

Prova qualcosa di simile:

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

Ciò introduce semplicemente un timeout in modo che al termine del ciclo di eventi di "pressione del tasto", il codice verrà eseguito quasi immediatamente dopo. Un intervallo di tempo così breve (anche se arrotondato per eccesso dal browser) non sarà visibile.

modifica - o si potrebbe usare "KeyUp" come tutti gli altri, dice, anche se la sua semantica sono diversi.


Non è una questione di benig smart . L'evento keyup non fornisce lo stesso risultato. Ottieni eventi distinti per shift, ctrl, ecc. Con keyup - se vuoi che il carattere effettivo venga digitato (come una e commerciale) piuttosto che una serie di eventi chiave che devi controllare lo stato dei tasti shift o ctrl, premere il tasto è la strada da percorrere.
Ripside

1
Destra; questo è ciò che intendevo con "la semantica è diversa".
Pointy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.