Was ist der Unterschied zwischen diesen drei Ereignissen? Beim googeln stellte ich fest, dass:
- Das
onKeyDown
Ereignis wird ausgelöst, wenn der Benutzer eine Taste drückt.- Das
onKeyUp
Ereignis wird ausgelöst, wenn der Benutzer einen Schlüssel freigibt.- Das
onKeyPress
Ereignis wird ausgelöst, wenn der Benutzer eine Taste drückt und loslässt (onKeyDown
gefolgt vononKeyUp
).
Ich verstehe die ersten beiden, aber ist das nicht onKeyPress
dasselbe wie onKeyUp
? Ist es möglich, eine Taste ( onKeyUp
) loszulassen, ohne sie zu drücken ( onKeyDown
)?
Das ist ein bisschen verwirrend, kann jemand das für mich klären?
javascript
dom
dom-events
instantsetsuna
quelle
quelle
Antworten:
Suchen Sie hier nach dem archivierten Link, der ursprünglich in dieser Antwort verwendet wurde.
Von diesem Link:
quelle
KeyPress
,KeyUp
UndKeyDown
sind analog zu jeweils:Click
,MouseUp,
undMouseDown
.Down
passiert zuerstPress
passiert als zweites (wenn Text eingegeben wird)Up
passiert zuletzt (wenn die Texteingabe abgeschlossen ist).Die Ausnahme ist das Webkit , in dem ein zusätzliches Ereignis enthalten ist:
Unten finden Sie einen Ausschnitt, mit dem Sie selbst sehen können, wann die Ereignisse ausgelöst werden:
quelle
keypress
undkeydown
buchstäblich derselbe.timeStamp
Wert zugewiesen , der auf Intervalle von 5 Mikrosekunden genau ist, aber das ist sowieso nicht wirklich mein Punkt. Mein Punkt ist, dass dasclick
Ereignis erst ausgelöst wird, wenn Sie die Maustaste loslassen. Wenn Sie also sagen, dasskeypress
es sich um die Tastaturversion von handelt,click
wird eskeypress
ebenfalls nicht ausgelöst, bis Sie die Taste loslassen . Tatsächlich ist das nicht der Fall: Es wird ausgelöst, wenn die Taste gedrückt wird, genau wiekeydown
dies der Fall ist . Istkeypress
also überhaupt nicht analog zuclick
.keypress
,keyup
undkeydown
sind analog zuclick
,mouseup
undmousedown
. Die natürliche Interpretation davon ist für mich, dass daskeypress
Feuer im selben Moment wiekeyup
(genau wieclick
undmouseup
) ausgelöst wird . Was hast du gemeint, wenn nicht das?Die meisten Antworten hier konzentrieren sich mehr auf Theorie als auf praktische Fragen, und es gibt einige große Unterschiede zwischen
keyup
undkeypress
in Bezug auf Eingabefeldwerte, zumindest in Firefox (getestet in 43).Wenn der Benutzer
1
ein leeres Eingabeelement eingibt:Der Wert des Eingabeelements ist eine leere Zeichenfolge (alter Wert) im
keypress
HandlerDer Wert des Eingabeelements befindet sich
1
(neuer Wert) imkeyup
Handler.Dies ist von entscheidender Bedeutung, wenn Sie etwas tun, das darauf beruht, den neuen Wert nach der Eingabe zu kennen und nicht den aktuellen Wert, wie z. B. Inline-Validierung oder Auto-Tabbing.
Szenario:
12345
ein Eingabeelement ein.12345
.A
.Wenn das
keypress
Ereignis nach Eingabe des BuchstabensA
ausgelöst wird, enthält das Textfeld nur noch den BuchstabenA
.Aber:
12345
.5
So scheint es , dass der Browser (Firefox 43) die Auswahl des Benutzers löscht, dann löst der
keypress
Fall, dann die Felder Inhalte aktualisiert, dann feuertkeyup
.quelle
onkeydown
wird ausgelöst, wenn die Taste gedrückt ist (wie bei Verknüpfungen; z. B. inCtrl+A
,Ctrl
wird gedrückt gehalten).onkeyup
wird ausgelöst, wenn die Taste losgelassen wird (einschließlich Modifikator / etc-Tasten)onkeypress
wird als Kombination vononkeydown
undonkeyup
oder abhängig von der Tastaturwiederholungonkeyup
ausgelöst (wenn nicht ausgelöst). (Dieses Wiederholungsverhalten habe ich nicht getestet. Wenn Sie testen, fügen Sie einen Kommentar hinzu!)textInput
(nur Webkit) wird ausgelöst, wenn Text eingegeben wird (z. B.Shift+A
würde Großbuchstaben 'A' eingegeben, aberCtrl+A
Text ausgewählt und keine Texteingabe eingegeben. In diesem Fall werden alle anderen Ereignisse ausgelöst).quelle
Erstens haben sie eine andere Bedeutung: Sie feuern:
Zweitens lösen einige Schlüssel einige dieser Ereignisse aus und andere nicht . Zum Beispiel,
Beachten Sie außerdem, dass
event.keyCode
(undevent.which
) normalerweise den gleichen Wert für KeyDown und KeyUp haben, für KeyPress jedoch einen anderen. Probieren Sie den Spielplatz aus, den ich erstellt habe. Übrigens habe ich eine ziemliche Eigenart bemerkt: Wenn ich in Chrome ctrl+ drücke aund dasinput
/textarea
leer ist, wird KeyPress mitevent.keyCode
(undevent.which
) gleich ausgelöst1
! (Wenn der Eingang nicht leer ist, wird er überhaupt nicht ausgelöst).Schließlich gibt es einige Pragmatik :
textarea
KeyPress und KeyDown, werden mehrmals verwendet (Chrome 71), wenn ich das Ereignis benötige, das mehrmals ausgelöst wird, und KeyUp für die Freigabe eines einzelnen Schlüssels.input
s undtextarea
s in verschiedenen Browsern unterschiedlich (hauptsächlich aufgrund von Fokusverlust ).Ich habe alle 3 in meinem Projekt verwendet, aber leider etwas Pragmatik vergessen. (zu beachten: es gibt auch
input
undchange
Ereignisse)quelle
Dieser Artikel von Jan Wolter ist das beste Stück, das mir begegnet ist. Die archivierte Kopie finden Sie hier, wenn der Link tot ist.
Es erklärt alle Browser-Schlüsselereignisse wirklich gut,
quelle
Es scheint, dass onkeypress und onkeydown dasselbe tun (innerhalb des kleinen Unterschieds der oben bereits erwähnten Tastenkombinationen).
Sie können dies versuchen:
Und Sie werden sehen, dass die Ereignisse beim Drücken der Taste und beim Herunterfahren beide ausgelöst werden, während die Taste gedrückt wird, und nicht, wenn die Taste gedrückt wird.
Der Unterschied besteht darin, dass das Ereignis nicht nur einmal, sondern mehrmals ausgelöst wird (solange Sie die Taste gedrückt halten). Seien Sie sich dessen bewusst und gehen Sie entsprechend damit um.
quelle
keypress
Ereignis, lösen jedoch immer ein auskeydown
.Das Ereignis onkeypress funktioniert für alle Tasten außer ALT, STRG, UMSCHALT, ESC in allen Browsern, wobei das Ereignis onkeydown für alle Tasten funktioniert. Bedeutet, dass das Ereignis onkeydown alle Schlüssel erfasst.
quelle
Ich wollte nur eine Neugier teilen:
Wenn Sie das onkeydown-Ereignis zum Aktivieren einer JS-Methode verwenden, stimmt der Zeichencode für dieses Ereignis NICHT mit dem überein, den Sie mit onkeypress erhalten!
Zum Beispiel geben die Numpad-Tasten die gleichen Zeichen wie die Zifferntasten über den Buchstabentasten zurück, wenn Sie onkeypress verwenden, aber NICHT, wenn Sie onkeydown verwenden!
Ich habe einige Sekunden gebraucht, um herauszufinden, warum mein Skript, das nach bestimmten Zeichencodes gesucht hat, bei der Verwendung von onkeydown fehlgeschlagen ist!
Demo: https://www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK
und ja. Ich weiß, dass die Definition der Methoden unterschiedlich ist. Aber was sehr verwirrend ist, ist, dass bei beiden Methoden das Ergebnis des Ereignisses mit event.keyCode abgerufen wird. Aber sie geben nicht den gleichen Wert zurück. Nicht sehr deklarative Umsetzung.
quelle
0123456789
)Grundsätzlich verhalten sich diese Ereignisse bei verschiedenen Browsertypen und -versionen unterschiedlich. Ich habe einen kleinen jsBin-Test erstellt. Sie können in der Konsole nachsehen, wie sich diese Ereignisse für Ihre Zielumgebung verhalten. Hoffen Sie, dass diese Hilfe hilft. http://jsbin.com/zipivadu/10/edit
quelle
Aktualisierte Antwort:
Taste nach unten
Tastendruck
KeyUp
Dies ist das Verhalten in
addEventListener
undjQuery
.https://jsbin.com/vebaholamu/1/edit?js,console,output <- Beispiel versuchen
(Antwort wurde mit korrekter Antwort, Screenshot & Beispiel bearbeitet)
quelle
Einige praktische Fakten, die hilfreich sein können, um zu entscheiden, welches Ereignis behandelt werden soll (führen Sie das folgende Skript aus und konzentrieren Sie sich auf das Eingabefeld):
Drücken:
nicht Einführungs / Tipptasten (zB Shift, Ctrl) wird ein nicht auslösen
keypress
. Drücken Sie Ctrlund lassen Sie es los:Tasten von Tastaturen , die Zeichen Transformationen in andere Zeichen können führen gelten Toten und duplizieren „Schlüssel“ (zB ~, ´) auf
keydown
. Drücken ´und loslassen , um eine doppelte anzuzeigen´´
:Darüber hinaus
<input type="range">
lösen nicht tippende Eingaben (z. B. Fernkampf ) weiterhin alle Keyup-, Keydown- und Tastendruckereignisse entsprechend den gedrückten Tasten aus.quelle