133 Stimmen

Prüfen, ob eine Taste gedrückt ist?

Gibt es eine Möglichkeit, in JavaScript zu erkennen, ob eine Taste gerade gedrückt ist?

Ich kenne das Ereignis "keydown", aber das ist nicht das, was ich brauche. Einige Zeit NACH dem Drücken der Taste, möchte ich in der Lage sein, zu erkennen, ob es noch gedrückt wird.

P. S. Das größte Problem scheint zu sein, dass nach einer gewissen Zeit die Taste beginnt zu wiederholen, Abfeuern von keydown und keyup Ereignisse wie ein Unhold. Hoffentlich gibt es nur eine einfache isKeyDown(key) Funktion, aber wenn nicht, dann wird dieses Problem zu überwinden / gearbeitet werden müssen, um.

15 Stimmen

Ein häufiges Problem bei den Antworten, die ich hier sehe, ist, dass, wenn Sie eine Taste gedrückt halten, dann die Registerkarte wechseln oder den Fokus ändern, die Taste loslassen und dann zurückschalten, der Code glaubt, dass die Taste gedrückt ist, bis Sie sie erneut drücken oder die Maus über die Seite bewegen :-(

0 Stimmen

Ist damit Ihre Frage beantwortet? JavaScript: Prüfen, ob Maustaste gedrückt?

181voto

Devin Rhode Punkte 20592

Neben der Verwendung von keyup y keydown Hörer zu verfolgen, wann die Taste nach unten und wieder nach oben geht, gibt es son tatsächlich einige Eigenschaften, die Ihnen sagen, ob bestimmte Tasten gedrückt sind.

window.onmousemove = function (e) {
  if (!e) e = window.event;
  if (e.shiftKey) {/*shift is down*/}
  if (e.altKey) {/*alt is down*/}
  if (e.ctrlKey) {/*ctrl is down*/}
  if (e.metaKey) {/*cmd is down*/}
}

Diese sind für alle vom Browser erzeugten Ereignisobjekte verfügbar, wie z. B. für die von keydown , keyup y keypress so dass Sie die Mausbewegung nicht verwenden müssen.

Ich habe versucht, meine eigenen Ereignisobjekte mit document.createEvent('KeyboardEvent') y document.createEvent('KeyboardEvent') und auf der Suche nach e.shiftKey und so weiter, aber ich hatte kein Glück.

Ich verwende Chrome 17 auf dem Mac

0 Stimmen

Ich verwende dies sowohl in neuen als auch in alten Browsern, sogar in HTA's

1 Stimmen

Gibt es eine Möglichkeit, diese Antwort zu implementieren, wenn eine Nummer gerade nicht verfügbar ist? Ich habe es mit if (e.keyCode==49) {console.log("1 is down");} versucht, aber es funktioniert nicht :(

0 Stimmen

Hey @RobertoSepúlvedaBravo Robert scheint deine Frage in der nächsten Antwort zu beantworten. ;)

99voto

bobince Punkte 512550

Gibt es eine Möglichkeit, in JavaScript zu erkennen, ob eine Taste gerade gedrückt ist?

Nö. Die einzige Möglichkeit ist die Überwachung jedes keyup y keydown und sich erinnern.

Nach einer gewissen Zeit beginnt die Taste, sich zu wiederholen, und löst wie ein Ungeheuer Tastendruck- und Tastendruckereignisse aus.

Das sollte es nicht. Sie bekommen auf jeden Fall keypress wiederholt, und in vielen Browsern erhalten Sie auch wiederholte keydown aber wenn keyup wiederholt, ist das ein Fehler.

Leider handelt es sich dabei nicht um einen völlig unbekannten Fehler: Unter Linux erzeugen sowohl Chromium als auch Firefox (wenn es unter GTK+ ausgeführt wird, was in beliebten Distributionen wie Ubuntu der Fall ist) wiederholte Keyup-Keypress-Keydown-Sequenzen für gehaltene Tasten, die nicht von einem sehr schnellen Tastendruck zu unterscheiden sind.

22 Stimmen

Sie, mein Herr, sind ein Gentleman und ein Gelehrter. Chromium und Firefox auf Ubuntu sind meine primäre Entwicklungsumgebung, so dass genau das Problem, das ich gesehen habe, erklärt. Hoffentlich wird es besser werden, sonst, dass Timer-Hack-Lösung könnte die einzige Abhilfe sein.

3 Stimmen

Ja, es ist frustrierend, dass es in dieser Sache keine Fortschritte gibt. Siehe bugs.launchpad.net/ubuntu/+bug/369880 . Ich schreibe ein Browserspiel, und meine Lösung besteht im Moment darin, die Modifikatortasten (Umschalttaste, Strg usw.) zu verwenden, die sich überhaupt nicht wiederholen.

2 Stimmen

Nein, es es von echten wiederholten Tastendrücken zu unterscheiden, da sie keine entsprechenden keyup Veranstaltungen.

71voto

Robert Punkte 711

Meine Lösung:

var pressedKeys = {};
window.onkeyup = function(e) { pressedKeys[e.keyCode] = false; }
window.onkeydown = function(e) { pressedKeys[e.keyCode] = true; }

Ich kann nun überprüfen, ob irgendwo anders im Skript eine Taste gedrückt wird, indem ich prüfe

pressedKeys["code of the key"]

Wenn sie wahr ist, wird die Taste gedrückt.

3 Stimmen

Da keys bereits eine Funktion ist, könnte ein anderer Variablenname besser sein.

2 Stimmen

Dies wird nicht in allen Fällen funktionieren, um zu erkennen, ob die Alt-Taste gedrückt ist oder nicht.

2 Stimmen

Dies ist ideal für die Erkennung von oben / unten / links / rechts

12voto

FallenAvatar Punkte 4049

Ich glaube nicht, dass es so etwas wie eine isKeyDown-Funktion gibt, aber Sie könnten Ihre eigene schreiben.

Erstellen Sie ein Array, dessen Länge der Anzahl der Schlüssel entspricht, die Sie überwachen möchten. Dann mit der Dokumente/Seiten/Steuerelemente keyUp und keyDown-Ereignisse, aktualisieren Sie das Array mit dieser Taste den Zustand.

Schreiben Sie dann eine Funktion, die prüft, ob eine bestimmte Taste gedrückt ist und ein bool zurückgibt.

var keyEnum = { W_Key:0, A_Key:1, S_Key:2, D_Key:3 };
var keyArray = new Array(4);

function onKeyDown()
{
    // Detect which key was pressed
    if( key == 'w' )
        keyArray[keyEnum.W_Key] = true;
    // Repeat for each key you care about...
}

function onKeyUp()
{
    // Detect which key was released
    if( key == 'w' )
        keyArray[keyEnum.W_Key] = false;
    // Repeat for each key you care about...
}

function isKeyDown(key)
{
    return keyArray[key];
}

Damit sollten Sie das erreichen, was Sie wollen.

1 Stimmen

Das ist gut und in der Tat ein Teil der Lösung, aber es behebt nicht den Keyup-Wiederholungsfehler, der bei mir auftritt. Siehe die Antwort von bobince.

8 Stimmen

Dies ist keine gute Lösung, da Sie immer mehr Wenns schreiben würden. Ein "keyList = {};", das ein Objekt ist, akzeptiert "keyList[key] = true;" ohne die Notwendigkeit einer Aufzählung oder Begrenzung, da es String-Indizes/Eigenschaften verwendet und für alle Schlüssel funktioniert.

9voto

antonagestam Punkte 4101

Ich bin hier gelandet, um zu prüfen, ob der Browser schon etwas eingebaut hat, aber es scheint nicht so zu sein. Dies ist meine Lösung (sehr ähnlich zu Roberts Antwort):

"use strict";

const is_key_down = (() => {
    const state = {};

    window.addEventListener('keyup', (e) => state[e.key] = false);
    window.addEventListener('keydown', (e) => state[e.key] = true);

    return (key) => state.hasOwnProperty(key) && state[key] || false;
})();

Sie können dann prüfen, ob eine Taste gedrückt wurde mit is_key_down('ArrowLeft') .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X