it-swarm.com.de

Prüfen Sie, ob eine Taste gedrückt ist.

Gibt es eine Möglichkeit zu erkennen, ob in JavaScript derzeit ein Schlüssel nicht aktiv ist?

Ich weiß von dem "Keydown" -Ereignis, 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.

P. S. Das größte Problem scheint zu sein, dass der Schlüssel nach einiger Zeit beginnt, sich zu wiederholen, was das Auslösen von Tasten und Ereignisse wie ein Unterweltler auslöst. Hoffentlich gibt es nur eine einfache isKeyDown (key) -Funktion, aber wenn nicht, dann muss dieses Problem überwunden werden.

73
Daniel X Moore

Gibt es eine Möglichkeit zu erkennen, ob in JavaScript derzeit ein Schlüssel nicht aktiv ist?

Nee. Die einzige Möglichkeit besteht darin, jede keyup und keydown zu überwachen und sich daran zu erinnern.

nach einiger Zeit beginnt sich die Taste zu wiederholen, und die Keydown- und Keyup-Ereignisse werden wie ein Unterweltler ausgelöst.

Es sollte nicht Sie werden definitiv keypress wiederholen, und in vielen Browsern wird keydown wiederholt angezeigt. Wenn sich keyup jedoch wiederholt, ist dies ein Fehler.

Leider ist es kein völlig unbekannter Fehler: Unter Linux, Chromium und Firefox (wenn es unter GTK + läuft, was sich in beliebten Distributionen wie Ubuntu befindet), erzeugen beide wiederholte Tastenkombinationen für gedrückt gehaltene Tasten was unmöglich ist, von jemandem zu unterscheiden, der den Schlüssel wirklich schnell hämmert.

55
bobince

Zusätzlich zu den keyup- und keydown-Listenern, um zu verfolgen, wann eine Taste herunter- und zurück geht, gibt es are tatsächlich einige Eigenschaften, die Ihnen mitteilen, wenn bestimmte Tasten deaktiviert 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 stehen in allen vom Browser generierten Ereignisobjekten zur Verfügung, z. B. von keydown, keyup und keypress, sodass Sie keine Mausemove verwenden müssen.

Ich habe versucht, mit document.createEvent('KeyboardEvent') und document.createEvent('KeyboardEvent') eigene Ereignisobjekte zu generieren und nach e.shiftKey und so zu suchen, aber ich hatte kein Glück.

Ich verwende Chrome 17 auf dem Mac

109
Devin G Rhode

Meine Lösung:

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

Ich kann jetzt überprüfen, ob eine Taste an einer anderen Stelle im Skript gedrückt wird

keys["code of the key"]

Ist dies der Fall, wird die Taste gedrückt.

32
Robert

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 das Array mit den Dokumenten/Seiten/Steuerelementen keyUp- und keyDown-Ereignissen mit dem Status dieses Schlüssels.

Schreiben Sie dann eine Funktion, die überprüft, ob eine bestimmte Taste nicht aktiv ist, und einen 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];
}

Das sollte erreichen, was Sie wollen.

11
FallenAvatar
/*
Tracks what keys are currently down on the keyboard
*/

function keyboard_module(onUpdate){
    var kb = {};
    var unicode_mapping = {};
    document.onkeydown = function(e){
        var unicode=e.charCode? e.charCode : e.keyCode
        var key = getKey(unicode);
        kb[key] = true;
        if(onUpdate){
            onUpdate(kb);
        }
    }

    document.onkeyup = function(e){
        var unicode=e.charCode? e.charCode : e.keyCode
        var key = getKey(unicode);
        delete kb[key];
        if(onUpdate){
            onUpdate(kb);
        }
    }

    function getKey(unicode){
        if(unicode_mapping[unicode]){
            var key = unicode_mapping[unicode];
        }else{
            var key= unicode_mapping[unicode] = String.fromCharCode(unicode);
        }
        return key;
    }
    return kb;
}

function testing(kb){
    console.log('These are the down keys', kb);
}


var keyboard = keyboard_module(testing);

....
//somewhere else in the code
if(keyboard['K']){/*do something special */}
1
RobKohr

Andere Leute haben diese Art von Frage schon einmal gestellt (obwohl ich hier gerade keine offensichtlichen Dupes sehe).

Ich denke, die Antwort ist, dass das keydown-Ereignis (und sein Zwilling keyup) alle Informationen sind, die Sie erhalten. Das Wiederholen ist ziemlich fest mit dem Betriebssystem verbunden, und ein Anwendungsprogramm hat kaum Gelegenheit, 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 Abspringen des Schlüssels. Im Wesentlichen können Sie keydown und keyup selbst auswerten, ein keyup-Ereignis jedoch ignorieren, wenn es nach dem letzten keydown...-Vorgang zu schnell erfolgt, oder Sie sollten Ihre Antwort lange genug auf keyup verzögern, um sicherzugehen, dass kein anderes keydown-Ereignis folgt 0,25 Sekunden der keyup.

Dazu müssen Sie eine Timer-Aktivität verwenden und die Millisekundenzeiten für vorherige Ereignisse aufzeichnen. Ich kann nicht sagen, dass es eine sehr ansprechende Lösung ist, aber ...

1
Carl Smotricz

Der folgende Code verwende ich:

var altKeyDownCount = 0;
window.onkeydown = function (e) {
    if (!e) e = window.event;
    if (e.altKey) {
        altKeyDownCount++;
        if (30 < altKeyDownCount) {
            $('.key').removeClass('hidden');
            altKeyDownCount = 0;
        }
        return false;
    }
}

window.onkeyup = function (e) {
    if (!e) e = window.event;
    altKeyDownCount = 0;
    $('.key').addClass('hidden');
}

Wenn der Benutzer die Alt-Taste einige Zeit gedrückt hält (etwa 2 Sekunden), wird eine Gruppe von Beschriftungen (Klasse = 'ausgeblendete Taste') angezeigt. Wenn Sie die Alt-Taste loslassen, werden die Beschriftungen ausgeblendet. jQuery und Bootstrap werden beide verwendet.

1
Johnny

Schau dir this answer an und verwende onkeyup und onkeydown. Hier sind genauere Informationen zu diesen Ereignissen.

0
Claudiu

Ich habe die obigen Antworten gescannt und der vorgeschlagene keydown/keyup-Ansatz funktioniert nur unter besonderen Umständen. Wenn der Benutzer alt-tabs entfernt oder ein neues Browserfenster oder eine neue Registerkarte mit einer Tastaturbewegung geöffnet wird, wird eine Variable keydown registriert. Dies ist in Ordnung, da zu diesem Zeitpunkt nicht festgestellt werden kann, ob es sich bei der Web-App um einen Schlüssel handelt Überwachung oder ist ein Standardbrowser oder eine Betriebssystemverknüpfung. Wenn Sie zur Browserseite zurückkehren, wird der Schlüssel immer noch als gehalten betrachtet, obwohl er in der Zwischenzeit freigegeben wurde. Oder eine Taste wird einfach gehalten, während der Benutzer mit der Maus zu einem anderen Tab oder einer anderen Anwendung wechselt und dann außerhalb unserer Seite freigegeben wird.

Modifizierertasten (Shift usw.) können über mousemove usw. überwacht werden. Es wird davon ausgegangen, dass beim Zurückblättern mindestens eine Mausinteraktion erwartet wird, was häufig der Fall ist.

Bei den meisten anderen Tasten (außer den Modifizierern Tab, Delete, aber Space, Enter) würde die Überwachung von keypress für die meisten Anwendungen funktionieren - eine gedrückte Taste wird weiterhin ausgelöst. Das Zurücksetzen des Schlüssels ist jedoch aufgrund der Periodizität der keypress-Auslösung etwas verzögert. Wenn keypress nicht immer weiterläuft, können die meisten Tasten grundsätzlich ausgeschlossen werden. In Kombination mit den Modifikatoren ist dies ziemlich luftdicht, obwohl ich noch nicht herausgefunden habe, was mit Tab und Backspace zu tun ist.

Ich bin sicher, es gibt eine Bibliothek, die über diese DOM-Schwäche abstrahiert, oder vielleicht hat sich eine DOM-Standardänderung darum gekümmert, da dies eine ziemlich alte Frage ist.

0
Robert Monfera

Ich bin hier gelandet, um zu überprüfen, ob der Browser bereits etwas eingebaut hat, aber es scheint, als wäre es nicht. Dies ist meine Lösung (sehr ähnlich zu Roberts Antwort):

"use strict";

let is_key_down = (() => {
    let 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;
})();

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

0
antonagestam

Ich weiß, dass dies eine sehr alte Frage ist, jedoch gibt es eine sehr einfache (~ .5Kb) JavaScript-Bibliothek, die das inkonsistente Auslösen von Tastaturereignishandlern bei Verwendung der DOM-API effektiv "korrigiert".

Die Bibliothek ist Keydrown .

Hier ist das operative Codebeispiel, das für meine Zwecke gut funktioniert hat, indem einfach der Schlüssel geändert wird, auf den der Listener gesetzt werden soll:

kd.P.down(function () {
  console.log('The "P" key is being held down!');
});

kd.P.up(function () {
  console.clear();
});

// This update loop is the heartbeat of Keydrown
kd.run(function () {
  kd.tick();
});

Ich habe Keydrown in mein clientseitiges JavaScript integriert, um eine richtige Pause-Animation in einem Rotlicht-Grünlicht-Spiel zu erstellen, 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.

0
buildpax