Gibt es eine Möglichkeit zu erkennen, ob ein Schlüssel derzeit in JavaScript nicht verfügbar ist?
Ich weiß über das "Keydown" -Ereignis Bescheid, aber das brauche ich nicht. Einige Zeit nach dem Drücken der Taste möchte ich feststellen können, ob sie noch gedrückt ist.
PS Das größte Problem scheint zu sein, dass sich der Schlüssel nach einiger Zeit zu wiederholen beginnt und Keydown- und Keyup-Ereignisse wie ein Unhold auslöst. Hoffentlich gibt es nur eine einfache isKeyDown (Schlüsselfunktion), aber wenn nicht, muss dieses Problem behoben / umgangen werden.
javascript
input
keyboard
Daniel X Moore
quelle
quelle
Antworten:
Nee. Die einzige Möglichkeit ist die Überwachung jeder
keyup
undkeydown
und Erinnerung.Es sollte nicht. Sie werden sich definitiv
keypress
wiederholen, und in vielen Browsern werden Sie auch wiederholtkeydown
, aber wenn Sie sichkeyup
wiederholen, ist es ein Fehler.Leider ist dies kein völlig unbekannter Fehler: Unter Linux, Chromium und Firefox (wenn es unter GTK + ausgeführt wird, das in beliebten Distributionen wie Ubuntu verwendet wird) werden beide wiederholte Keyup-Keypress-Keydown-Sequenzen für gehaltene Tasten generiert. die unmöglich zu unterscheiden sind von jemandem, der den Schlüssel wirklich schnell hämmert.
quelle
keyup
Ereignisse zu unterscheiden.Neben der Verwendung von
keyup
und denkeydown
Listenern, um zu verfolgen, wann die Taste herunter und wieder hoch geht, gibt es tatsächlich einige Eigenschaften, die Ihnen mitteilen, ob bestimmte Tasten gedrückt sind.Diese sind auf allen Browser erzeugte Ereignisobjekte zur Verfügung, wie sie aus
keydown
,keyup
undkeypress
, so dass Sie verwenden mousemove- nicht haben.Ich habe versucht, meine eigenen Ereignisobjekte mit
document.createEvent('KeyboardEvent')
und zu generierendocument.createEvent('KeyboardEvent')
und danach zu suchene.shiftKey
, aber ich hatte kein Glück.Ich verwende Chrome 17 auf dem Mac
quelle
Meine Lösung:
Ich kann jetzt überprüfen, ob irgendwo im Skript eine Taste gedrückt wurde, indem ich überprüfe
Wenn es wahr ist, wird die Taste gedrückt.
quelle
Ich glaube nicht, dass es so etwas wie eine isKeyDown-Funktion gibt, aber Sie könnten Ihre eigene schreiben.
Erstellen Sie grundsätzlich ein Array, dessen Länge der Anzahl der zu überwachenden Schlüssel entspricht. Aktualisieren Sie dann mithilfe der Dokumente / Seiten / Steuerelemente keyUp und keyDown das Array mit dem Status dieses Schlüssels.
Schreiben Sie dann eine Funktion, die prüft, ob eine bestimmte Taste gedrückt ist, und einen Bool zurückgibt.
Das sollte erreichen, was Sie wollen.
quelle
Ich bin hier gelandet, um zu überprüfen, ob bereits etwas im Browser integriert ist, aber es scheint, dass dies nicht der Fall ist. Dies ist meine Lösung (sehr ähnlich zu Roberts Antwort):
Sie können dann überprüfen, ob eine Taste mit gedrückt wurde
is_key_down('ArrowLeft')
.quelle
Andere Leute haben diese Art von Frage schon einmal gestellt (obwohl ich hier momentan keine offensichtlichen Betrüger sehe).
Ich denke, die Antwort ist, dass das
keydown
Ereignis (und sein Zwillingkeyup
) alle Informationen sind, die Sie erhalten. Das Wiederholen ist ziemlich fest mit dem Betriebssystem verbunden, und ein Anwendungsprogramm hat kaum die Möglichkeit, das BIOS nach dem tatsächlichen Status des Schlüssels abzufragen.Was Sie tun können und müssen, wenn Sie dies zum Laufen bringen müssen, ist das programmgesteuerte Abprallen des Schlüssels. Im Wesentlichen können Sie bewerten
keydown
undkeyup
sich selbst , sondern eine ignorierenkeyup
Ereignis , wenn es Platz zu schnell nach dem letzten nimmtkeydown
... oder im Wesentlichen, sollten Sie Ihre Antwort verzögernkeyup
lange genug um sicher zu sein , gibt es kein anderes istkeydown
Ereignis mit etwas folgenden wie 0,25 Sekunden von derkeyup
.Dies würde die Verwendung einer Zeitgeberaktivität und die Aufzeichnung der Millisekundenzeiten für frühere Ereignisse umfassen. Ich kann nicht sagen, dass es eine sehr ansprechende Lösung ist, aber ...
quelle
quelle
Der folgende Code ist was ich benutze:
Wenn der Benutzer die Alt-Taste einige Zeit (ca. 2 Sekunden) gedrückt hält, wird eine Gruppe von Beschriftungen (class = 'key hidden') angezeigt. Wenn Sie die Alt-Taste loslassen, verschwinden die Beschriftungen. jQuery und Bootstrap werden beide verwendet.
quelle
Ich weiß, dass dies eine sehr alte Frage ist, aber es gibt eine sehr leichte (~ 0,5 KB) JavaScript-Bibliothek, die das inkonsistente Auslösen von Tastaturereignishandlern bei Verwendung der DOM-API effektiv "patcht".
Die Bibliothek ist Keydrown .
Hier ist das operative Codebeispiel, das für meine Zwecke gut funktioniert hat, indem nur die Taste geändert wurde, auf der der Listener eingestellt werden soll:
Ich habe Keydrown in mein clientseitiges JavaScript integriert, um eine korrekte Pausenanimation in einem Rotlicht-Grünlicht-Spiel zu erhalten, das ich schreibe. Sie können das gesamte Spiel hier ansehen . (Hinweis: Wenn Sie dies in Zukunft lesen, sollte das Spiel vollständig und spielbar sein :-D!)
Ich hoffe das hilft.
quelle
Ich habe die obigen Antworten gescannt und der vorgeschlagene
keydown
/keyup
Ansatz funktioniert nur unter besonderen Umständen. Wenn der Benutzer die Alt-Tabs entfernt oder eine neue Geste verwendet, um ein neues Browserfenster oder einen neuen Tab zu öffnen,keydown
wird a registriert. Dies ist in Ordnung, da zu diesem Zeitpunkt nicht erkennbar ist, ob der Schlüssel von der Web-App überwacht wird , oder ist eine Standardbrowser- oder Betriebssystemverknüpfung. Wenn Sie zur Browserseite zurückkehren, wird der Schlüssel immer noch gehalten, obwohl er in der Zwischenzeit freigegeben wurde. Oder eine Taste wird einfach gedrückt gehalten, während der Benutzer mit der Maus zu einem anderen Tab oder einer anderen Anwendung wechselt und diese dann außerhalb unserer Seite loslässt.Modifizierertasten (
Shift
usw.) können übermousemove
usw. überwacht werden, vorausgesetzt, dass beim Zurückschieben mindestens eine Mausinteraktion erwartet wird, was häufig der Fall ist.Für die meisten alle anderen Tasten ( mit Ausnahme von Modifikatoren
Tab
,Delete
aber einschließlichSpace
,Enter
), die Überwachungkeypress
für die meisten Anwendungen funktionieren würde - statt ein Schlüssel zum Feuer wird weiterhin nach unten. Aufgrund der Periodizität deskeypress
Feuers tritt jedoch eine gewisse Latenz beim Zurücksetzen des Schlüssels auf . Wennkeypress
nicht weiter geschossen wird, können die meisten Tasten grundsätzlich ausgeschlossen werden . In Kombination mit den Modifikatoren ist dies ziemlich luftdicht, obwohl ich nicht untersucht habe, was ich mitTab
und tun sollBackspace
.Ich bin mir sicher, dass es da draußen eine Bibliothek gibt, die über diese DOM-Schwäche abstrahiert, oder vielleicht hat sich eine DOM-Standardänderung darum gekümmert, da es sich um eine ziemlich alte Frage handelt.
quelle
Schauen Sie sich diese Antwort an und verwenden Sie
onkeyup
undonkeydown
. Hier finden Sie genauere Informationen zu diesen Ereignissen.quelle
Dies funktioniert in Firefox und Chrome.
Ich musste eine spezielle HTML-Datei lokal öffnen (durch Drücken von,
Enter
wenn die Datei im Datei-Explorer unter Windows ausgewählt ist), entweder nur zum Anzeigen der Datei oder zum Bearbeiten in einem speziellen Online-Editor.Daher wollte ich zwischen diesen beiden Optionen unterscheiden, indem ich die
Ctrl
Taste-gedrückt hielt oder nicht, während ich drückteEnter
.Wie Sie alle aus allen Antworten hier verstanden haben, scheint dies nicht wirklich möglich zu sein, aber hier ist ein Weg, der dieses Verhalten auf eine Weise nachahmt, die für mich akzeptabel war.
So funktioniert das:
Wenn Sie
Ctrl
beim Öffnen der Datei die Taste-gedrückt halten, wird im Javascript-Code niemals ein Keydown-Ereignis ausgelöst. Ein Keyup-Ereignis wird jedoch ausgelöst (wenn Sie dieCtrl
-Taste endgültig loslassen). Der Code erfasst das.Der Code deaktiviert auch Schlüsselereignisse (sowohl Keyup als auch Keydown), sobald einer von ihnen auftritt. Wenn Sie
Ctrl
also nach dem Öffnen der Datei die Taste- drücken , geschieht nichts.quelle
Wenn Sie Alt + Eingabetaste drücken, wird die Warnung angezeigt.
quelle