2010-06-17 19 views
89

Ich habe:Wie bekomme ich jquery. Val() AFTER Tastendruckereignis?

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

Jetzt ist der Alarm immer den Wert vor der keypress gibt (zB das Feld leer ist, ich ‚a‘ und der Alarm gibt mir ‚Typ‘ Geben Sie dann ich. ‚B‘ und die Alarm gibt mir 'a' ...). Aber ich möchte den Wert nach dem Tastendruck - wie kann ich das tun?

Hintergrund: Ich möchte eine Schaltfläche aktivieren, sobald das Textfeld mindestens ein Zeichen enthält. Also führe ich diesen Test bei jedem Tastendruck-Ereignis durch, aber mit dem zurückgegebenen val() ist das Ergebnis immer einen Schritt zurück. Die Verwendung des Ereignisses change() ist für mich keine Option, da die Schaltfläche deaktiviert ist, bis Sie das Textfeld verlassen. Wenn es einen besseren Weg gibt, es zu tun, bin ich froh, es zu hören!

+0

Sollte die Taste wieder deaktiviert werden, wenn der Text gelöscht wird? Wenn ja, müssen Sie wahrscheinlich bei Tastendruck bleiben. – Brilliand

Antwort

126

ändern keypress-keyup:

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

keypress ausgelöst wird, wenn die Taste gedrückt gedrückt wird, keyup ausgelöst wird, wenn die Taste losgelassen wird.

+0

Danke, ihr seid großartig! –

+0

frage mich, warum diese großartige Funktion so versteckt ist ... – Ron

+2

Funktioniert nicht, während der Schlüssel gedrückt wird ... – Brilliand

8

anstelle von Tastendruck, verwenden Sie keyup.

3

versuchen, etwas wie folgt aus:

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

, die einfach ein Timeout führt, so dass nach dem „keypress“ Ereignisschleife abgeschlossen ist, wird der Code fast unmittelbar danach ausgeführt werden. Ein solch kurzes Timer-Intervall (auch wenn es vom Browser aufgerundet wird) ist nicht bemerkbar.

bearbeiten — oder Sie konnte use „keyup“ wie jeder andere sagt, obwohl seine Semantik unterscheiden.

+0

Es ist nicht eine Frage von benig * smart *. Das keyup -Ereignis liefert nicht das gleiche Ergebnis. Sie erhalten unterschiedliche Ereignisse für shift, ctrl, etc mit keyup - wenn Sie das tatsächliche Zeichen eingeben möchten (wie ein kaufmännisches Und) und nicht eine Reihe von Schlüsselereignissen, die Sie den Status von shift oder ctrl keys, keypress überprüfen müssen ist der Weg zu gehen. – Ripside

+0

Rechts; das meinte ich mit "es ist Semantik anders". – Pointy

3

Eventuell möchten Sie einen onchange Event-Handler anschließen, anstatt eines der Schlüsselereignisse zu verwenden.

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

Mit Edit > Paste oder einem Rechtsklick dann ein Änderungsereignis einfügen wird ausgelöst, aber nicht ein Schlüsselereignis. Hinweis einige Browser können ein Schlüsselereignis auf eine Paste simulieren (obwohl ich keine davon kenne), aber Sie können nicht auf dieses Verhalten zählen.

4

Alternativ können Sie das KeyDown-Ereignis mit einem Timeout von 0

Auf diese Weise verwenden, werden die Änderungen sofort angewendet werden, statt angelegt wird, wenn der Benutzer aufhört, die Taste gedrückt halten.

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

Dies wird sich immer noch seltsam verhalten, wenn Sie die Rücktaste gedrückt halten ... vielleicht einen Tastendruck mit einer Zeitüberschreitung von 0? – Brilliand

+0

Ah, macht nichts, das OP spezifiziert nicht, was geschehen sollte, wenn das Textfeld gelöscht wird. – Brilliand

+0

rlly? 'Timeout' ?. scheint keine gute Idee zu sein – jose920405

49

überrascht, dass niemand die js "input" Ereignis erwähnt:

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

empfohlen.

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

+7

Wow, das ist die Antwort auf einige unbeantwortete/schlecht beantwortete SO Fragen. – BenRacicot

+3

Das ist auch gut, wenn Sie die Eingabe von Pfeiltasten, Shift usw. im Eingabefeld ignorieren müssen. – hovado

+3

Dies sollte die akzeptierte Antwort im Jahr 2016 sein! – adarshr