Ich versuche, den Text in ein Textfeld zu bekommen, während der Benutzer ihn eingibt ( jsfiddle playground ):
function edValueKeyPress() {
var edValue = document.getElementById("edValue");
var s = edValue.value;
var lblValue = document.getElementById("lblValue");
lblValue.innerText = "The text box contains: " + s;
//var s = $("#edValue").val();
//$("#lblValue").text(s);
}
<input id="edValue" type="text" onKeyPress="edValueKeyPress()"><br>
<span id="lblValue">The text box contains: </span>
Der Code wird fehlerfrei ausgeführt, mit der Ausnahme, dass der Wert der input text
Box während onKeyPress
immer der Wert vor der Änderung ist:
Frage : Wie erhalte ich währenddessen den Text eines Textfelds
onKeyPress
?
Bonus Chatter
Es gibt drei Ereignisse im Zusammenhang mit "Der Benutzer tippt" im HTML-DOM:
onKeyDown
onKeyPress
onKeyUp
In Windows wird die Reihenfolge der WM_Key
Nachrichten wichtig, wenn der Benutzer eine Taste gedrückt hält und sich die Taste wiederholt:
WM_KEYDOWN('a')
- Benutzer hat die ATaste gedrücktWM_CHAR('a')
- Eina
Zeichen wurde vom Benutzer empfangenWM_CHAR('a')
- Eina
Zeichen wurde vom Benutzer empfangenWM_CHAR('a')
- Eina
Zeichen wurde vom Benutzer empfangenWM_CHAR('a')
- Eina
Zeichen wurde vom Benutzer empfangenWM_CHAR('a')
- Eina
Zeichen wurde vom Benutzer empfangenWM_KEYUP('a')
- Der Benutzer hat den ASchlüssel freigegeben
Es werden fünf Zeichen in einem Textsteuerelement angezeigt: aaaaa
Der wichtige Punkt ist, dass Sie auf die WM_CHAR
Nachricht antworten , die sich wiederholt. Andernfalls verpassen Sie Ereignisse, wenn eine Taste gedrückt wird.
In HTML sieht es etwas anders aus:
onKeyDown
onKeyPress
onKeyDown
onKeyPress
onKeyDown
onKeyPress
onKeyDown
onKeyPress
onKeyDown
onKeyPress
onKeyUp
HTML liefert eine KeyDown
und KeyPress
jede Schlüsselwiederholung. Und das KeyUp
Ereignis wird nur ausgelöst, wenn der Benutzer den Schlüssel loslässt.
Nehmen Sie weg
- Ich kann auf
onKeyDown
oder antwortenonKeyPress
, aber beide werden noch angehoben, bevor dasinput.value
aktualisiert wurde - Ich kann nicht antworten
onKeyUp
, da dies nicht geschieht, wenn sich der Text im Textfeld ändert.
Frage: Wie erhalte ich währenddessen den Text eines Textfelds onKeyPress
?
Bonuslesung
quelle
onKeyUp
zeigt die Änderungen im Textfeld nicht sofort an .Antworten:
Das Handling
input
Ereignis ist eine konsequente Lösung: Es wird unterstützt fürtextarea
undinput
Elemente in allen modernen Browsern und es feuert genau , wenn Sie es brauchen:Ich würde das allerdings ein bisschen umschreiben:
quelle
Halte es einfach. Verwenden Sie beide
onKeyPress()
undonKeyUp()
:Dies sorgt dafür, dass der aktuellste Zeichenfolgenwert (nach dem Hochfahren des Schlüssels) abgerufen wird, und aktualisiert sich auch, wenn der Benutzer einen Schlüssel gedrückt hält.
jsfiddle: http://jsfiddle.net/VDd6C/8/
quelle
onKeyUp
(um den Verwendungszweck zu vereitelnonKeypress
), ist dies die einfachste, sauberste und am nächsten liegende Antwort, die jeder sehen wird. Nur der aufmerksamste Benutzer wird feststellen, dass das Feedback nicht mit dem übereinstimmt, was er eingegeben hat.<input>
Element rot oder grün zu färben oder dem Benutzer ein anderes Feedback zu geben, dass das, was er eingegeben hat, gut oder schlecht ist. Während Ihre akzeptierte Antwort immer noch unter dem Problem leidet, immer "off-by-one" zu sein : Nur der aufmerksamste Benutzer wird bemerken, dass das Feedback nicht mit dem übereinstimmt, was er eingegeben hat. " In Wirklichkeit, da das off-by- Ein Fehler tritt nur während der Tastenwiederholung auf (dh sie halten die Taste gedrückt). Niemand (außer mir) wird das Problem bemerken.Dies ist absichtlich so: Der Ereignis-Listener kann den Tastendruck abbrechen.
Wenn die Ereignis-Listener das Ereignis abbrechen , wird der Wert nicht aktualisiert. Wenn das Ereignis nicht abgebrochen wird, wird der Wert aktualisiert, jedoch nachdem der Ereignis-Listener aufgerufen wurde .
Um den Wert zu erhalten, nachdem der Feldwert aktualisiert wurde, planen Sie eine Funktion, die in der nächsten Ereignisschleife ausgeführt werden soll. Der übliche Weg, dies zu tun, besteht darin,
setTimeout
mit einer Zeitüberschreitung von0
:Versuchen Sie es hier: http://jsfiddle.net/Q57gY/2/
Bearbeiten : Einige Browser (z. B. Chrome) lösen keine Tastendruckereignisse für die Rücktaste aus. Tastendruck wurde geändert, um den Code einzugeben.
quelle
halte es kompakt.
Jedes Mal, wenn Sie eine Taste drücken, wird die Funktion
edValueKeyPress()
aufgerufen.Sie haben auch einige Variablen in dieser Funktion deklariert und initialisiert. Dies verlangsamt den Prozess und erfordert mehr CPU und Speicher.
Sie können diesen Code einfach verwenden - abgeleitet von einer einfachen Ersetzung.
Das ist alles was du willst und es ist schneller!
quelle
quelle
Keine der bisherigen Antworten bietet eine vollständige Lösung. Es gibt einige Probleme zu lösen:
keydown
und übergebenkeypress
Handler (zB Backspace und Löschtasten unterdrückt werden von einigen Browsern).keydown
ist keine gute Idee. Es gibt Situationen, in denen ein Tastendruck NICHT zu einem Tastendruck führt!setTimeout()
Stillösungen werden unter Google Chrome / Blink-Webbrowsern verzögert, bis der Benutzer aufhört zu tippen.Eine richtige Lösung behandelt die
keypress
,keyup
,input
undchange
Veranstaltungen.Beispiel:
Geige:
http://jsfiddle.net/VDd6C/2175/
Die Behandlung aller vier Ereignisse erfasst alle Randfälle. Bei der Arbeit mit Eingaben eines Benutzers sollten alle Arten von Eingabemethoden berücksichtigt und die browser- und geräteübergreifende Funktionalität überprüft werden. Der obige Code wurde in Firefox, Edge und Chrome auf dem Desktop sowie auf meinen Mobilgeräten getestet.
quelle
input
Event?input
feuert nicht immer. Kein einzelnes Ereignis deckt alle Situationen ab.keypress
in der Antwort angegeben hastNormalerweise verkette ich den Wert des Feldes (dh bevor es aktualisiert wird) mit dem Schlüssel, der dem Schlüsselereignis zugeordnet ist. Im Folgenden wird aktuelles JS verwendet, sodass Anpassungen für die Unterstützung in älteren IE vorgenommen werden müssen.
Aktuelles JS-Beispiel
Unterstützung für ältere IEs Beispiel
[BEARBEITEN - Dieser Ansatz deaktiviert standardmäßig das Drücken von Tasten für Dinge wie Rücktaste, STRG + A. Der obige Code passt zu ersteren, müsste aber weiter gebastelt werden, um letztere und einige andere Eventualitäten zu berücksichtigen. Siehe Ian Boyds Kommentar unten.]
quelle
delete
Taste oder wenn der Benutzer eine Taste drückt, die den Inhalt nicht ändert (Ctrl+A
), oder wenn der Benutzer Text auswählt und dann drückta
, um eine Teilmenge zu ersetzen. Es ist eine gute Idee, Utkanos, aber eine fragile.einfach...
Schreiben Sie in Ihren keyPress-Ereignishandler
quelle
e.KeyChar
derBackspace
Schlüssel ist? Oder derDelete
Schlüssel? OderCtrl+A
?void
?object
? Methoden in Großbuchstaben?Jede Veranstaltung hat also Vor- und Nachteile. Die Ereignisse
onkeypress
undonkeydown
rufen nicht den neuesten Wert ab und werdenonkeypress
in einigen Browsern nicht für nicht druckbare Zeichen ausgelöst. Dasonkeyup
Ereignis erkennt nicht, wenn eine Taste für mehrere Zeichen gedrückt gehalten wird.Das ist ein bisschen hacky, aber so etwas zu tun
scheint mit dem Besten aller Welten umzugehen.
quelle
Mit event.key können wir Werte vor der Eingabe in das HTML- Eingabetextfeld abrufen . Hier ist der Code.
quelle
Versuchen Sie, das Ereignis charCode mit dem Wert zu verknüpfen, den Sie erhalten. Hier ist ein Beispiel meines Codes:
js:
Der Wert in
ab
erhält den neuesten Wert im Eingabefeld.quelle
Es gibt einen besseren Weg, dies zu tun. Verwenden Sie die Concat-Methode. Beispiel
Deklarieren Sie eine globale Variable. Dies funktioniert gut bei Winkel 10, übergeben Sie es einfach an Vanilla JavaScript. Beispiel:
HTML
CODE
quelle
Delete
,Ctrl
+X
,Ctrl
+V
,Backspace
? Oder wenn sie einen Text ausgewählt haben und dann drückenA
?