jQuery ottiene il valore di input dopo la pressione di un tasto


129

Ho la seguente funzione:

$(document).ready(function() {
    $("#dSuggest").keypress(function() {
        var dInput = $('input:text[name=dSuggest]').val();
        console.log(dInput);
        $(".dDimension:contains('" + dInput + "')").css("display","block");
    });
});

Per qualche motivo, per la prima pressione dei tasti, sto ricevendo una stringa vuota nel registro della console.

Risposte:


157

Questo perché gli keypresseventi vengono attivati prima che il nuovo carattere venga aggiunto a quello valuedell'elemento (quindi il primo keypressevento viene generato prima dell'aggiunta del primo carattere, mentre valueè ancora vuoto). Dovresti keyupinvece usare , che viene lanciato dopo che il personaggio è stato aggiunto.

Nota che, se il tuo elemento #dSuggestè lo stesso input:text[name=dSuggest]puoi semplificare considerevolmente questo codice (e in caso contrario, avere un elemento con un nome uguale a quello iddi un altro elemento non è una buona idea).

$('#dSuggest').keypress(function() {
    var dInput = this.value;
    console.log(dInput);
    $(".dDimension:contains('" + dInput + "')").css("display","block");
});

2
Funziona, ma con jquery 2.x questo non è più aggiornato poiché la risposta che segue usando on e input è il modo migliore per farlo ora.
— Piotr Kula,

1
@ppumkin: solo perché jQuery 2 è uscito, non significa che le persone non debbano supportare IE8 e versioni precedenti. E non vedo nulla nei documenti che suggerisca il supporto effettivo per il inputtipo di evento.
— cookie monster

7
Correggi, dovrebbero smettere di supportare IE, punto. La maggior parte delle "soluzioni alternative" in jQuery 1.x sono per IE, quindi dovrebbe davvero essere rinominata in jQuerIE.
— Piotr Kula,

189

Rendendosi conto che questo è un post piuttosto vecchio, fornirò comunque una risposta mentre stavo lottando con lo stesso problema.

Dovresti "input"invece utilizzare l' evento e registrarti con il .onmetodo. Questo è veloce - senza il ritardo keyupe risolve l'ultimo problema di pressione dei tasti che descrivi.

$('#dSuggest').on("input", function() {
    var dInput = this.value;
    console.log(dInput);
    $(".dDimension:contains('" + dInput + "')").css("display","block");
});

Demo qui


26
Questo dovrebbe essere contrassegnato come una risposta corretta - il keyup forse risolve il problema del carattere mancante, ma è problematico determinare se il carattere è stato effettivamente scritto (e la chiave non era ad esempio "tab" o "home"). +1 per te
— Nashi,

Il problema è che non è supportato nei vecchi browser e IE9 non risponde ai caratteri eliminati.
— PhoneixS,

33

Utilizzare .keyupinvece di premere il tasto.

Utilizzare anche $(this).val()o solo this.valueper accedere al valore di input corrente.

DEMO qui

Informazioni .keypressdai documenti jQuery,

L'evento keypress viene inviato a un elemento quando il browser registra l'input da tastiera. Questo è simile all'evento keydown, tranne nel caso di ripetizioni dei tasti. Se l'utente preme e tiene premuto un tasto, un evento keydown viene attivato una volta, ma vengono attivati ​​eventi keypress separati per ciascun carattere inserito. Inoltre, i tasti modificatori (come Shift) attivano gli eventi keydown ma non gli eventi keypress.


5
keyupè troppo lento e un tasto può essere premuto e tenuto premuto senza essere rilasciato e le cose devono accadere. meglio usare keydowncon un po 'di timeout in modo che il valore cambi effettivamente.
— vsync,

l'unico aspetto negativo che ho riscontrato è che se l'utente premesse più di un carattere della tastiera insieme, non si sarebbe registrato correttamente.
— vsync,

5

È necessario interrompere il thread di esecuzione per consentire l'aggiornamento dell'input.

  $(document).ready(function(event) {
       $("#dSuggest").keypress(function() {
           //Interrupt the execution thread to allow input to update
               setTimeout(function() {
                   var dInput = $('input:text[name=dSuggest]').val();
                   console.log(dInput);
                   $(".dDimension:contains('" + dInput + "')").css("display","block");
               }, 0);
       });
  });

1
keyupil ritardo è troppo lento per alcuni scopi e non filtra automaticamente i tasti modificatori. Questo in realtà funziona meglio per me.
— Albert Bori,

migliore risposta. keyup - lento e non può catturare caratteri come @ con due tasti premuti.
— Roma Rush,

4

Questo perché l' Keypressevento viene generato prima dell'aggiunta del nuovo personaggio. Usa invece l'evento 'keyup', che funzionerà perfettamente nella tua situazione.

$(document).ready(function() {
    $("#dSuggest").keyup(function() {
        var dInput = $('input:text[name=dSuggest]').val();
        console.log(dInput);
        $(".dDimension:contains('" + dInput + "')").css("display","block");
    });
});

Voglio aggiungere a questo, se hai molte caselle di testo e devi fare la stessa cosa nel loro evento keyup puoi semplicemente dare loro una classe css comune (es. Commoncss) e applicare un evento keyup come questo.

$(document).ready(function() {
    $(".commoncss").keyup(function() {
        //your code
    });
});

questo ridurrà notevolmente il codice in quanto non è necessario applicare l'evento keyup in base all'ID per ciascuna casella di testo.


3

Stavo cercando un esempio ES6 (in modo che potesse passare la mia linter) Quindi per altre persone che stanno cercando lo stesso:

$('#dSuggest').keyup((e) => {
    console.log(e.currentTarget.value);
});

Vorrei anche usare il keyup perché ottieni il valore corrente che viene compilato.


1

Basta usare un timeout per effettuare la chiamata; il timeout verrà chiamato al termine dello stack di eventi (ovvero dopo che viene chiamato l'evento predefinito)

$("body").on('keydown', 'input[type=tel]', function (e) {
    setTimeout(() => {
        formatPhone(e)
    }, 0)
});

0

Penso che ciò di cui hai bisogno sia il prototipo di seguito

$(element).on('input',function(){code})

0

jQuery ottiene il valore di input dopo la pressione di un tasto

https://www.tutsmake.com/jquery-keypress-event-detect-enter-key-pressed/

i = 0;  
$(document).ready(function(){  
    $("input").keypress(function(){  
        $("span").text (i += 1);  
    });  
}); 
<!DOCTYPE html>  
<html>  
<head>  
<title>jQuery keyup() Method By Tutsmake Example</title> 
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>  
<body>  
Enter something: <input type="text">  
<p>Keypresses val count: <span>0</span></p>  
</body>  
</html>  

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.