Tastendruck erfassen, ohne ein Eingabeelement auf der Seite zu platzieren?

77

Wie erfasst man einen Tastendruck, z. B. Strg + Z, ohne ein Eingabeelement in JavaScript auf der Seite zu platzieren? Im IE können Tastendruck- und Tastendruckereignisse nur an Eingabeelemente (Eingabefelder, Textbereiche usw.) gebunden werden.

Powerboy
quelle
5
@Tim: Weil es unkonventionell wäre, Aktionen auszuführen, wenn diese Tastenkombinationen gedrückt werden, wenn ein GUI-Element nicht scharfgestellt ist, was gegen das Prinzip der geringsten Überraschung verstößt.
Leichtigkeitsrennen im Orbit
5
@Tomalak: Es gibt andere Elemente, für die man vernünftigerweise Schlüsselereignisse behandeln möchte, z. B. <canvas>obwohl ich zustimmen würde, dass ein solches Element gezwungen werden sollte, den Fokus zu haben, bevor Schlüsselereignisse ausgegeben werden. Durch die Verwendung eines tabindexAttributs kann ein Element den Fokus erhalten, wenn dies sonst nicht möglich ist.
Tim Down
2
Ich würde die Keypress-Javascript-Bibliothek empfehlen: dmauro.github.io/Keypress
xinthose
1
Ein weiterer Grund für die Erfassung von Tastatureingaben besteht darin, dass Sie nur Barcode auf dem Bildschirm anzeigen und einen Barcode-Scanner als Tastatureingabe verwenden. Was ich tue.
Robert
Die meisten Anwendungen verfügen über Tastaturkürzel ohne Eingabefokus. Gesunder Menschenverstand. Nehmen Sie zum Beispiel STRG-Z, um UNDO zu bedeuten.
Epirocks

Antworten:

39

jQuery hat auch eine hervorragende Implementierung, die unglaublich einfach zu bedienen ist. So können Sie diese Funktionalität in allen Browsern implementieren:

$(document).keypress(function(e){
    var checkWebkitandIE=(e.which==26 ? 1 : 0);
    var checkMoz=(e.which==122 && e.ctrlKey ? 1 : 0);

    if (checkWebkitandIE || checkMoz) $("body").append("<p>ctrl+z detected!</p>");
});

Getestet in IE7, Firefox 3.6.3 und Chrome 4.1.249.1064

Eine andere Möglichkeit besteht darin, das Keydown-Ereignis zu verwenden und den event.keyCode zu verfolgen. Da jQuery jedoch keyCode und charCode mithilfe von event.which normalisiert, empfiehlt die Spezifikation die Verwendung von event.which in verschiedenen Situationen:

$(document).keydown(function(e){
if (e.keyCode==90 && e.ctrlKey)
    $("body").append("<p>ctrl+z detected!</p>");
});
Trafalmadorianer
quelle
1
wusste nicht e.which kann sowohl Tastendruck als auch Mausklick erfassen! Und können Sie mir sagen, wie ich den Schlüsselcode 26 bekomme?
Powerboy
2
Der Schlüsselcode 26 ist eine spezifische ID für "welche", die durch ein Tastendruckereignis festgelegt wird (zeigt STRG + z an). Weitere Zeichenzuordnungen für das Tastendruckereignis finden Sie in den jQuery-Dokumenten oder im Schlüsselereignistester von
unixpapa
Danke. Ich weiß, was Keycode bedeutet. Ich meine, 17 ist für Strg, 90 ist für Z, wie hast du dann die Nummer 26 bekommen? Ich habe nur gegoogelt, konnte aber keine Antwort finden.
Powerboy
Verwenden Sie die Links, die ich in meinen Kommentar eingefügt habe, um die Codes für verschiedene Tastenanschläge zu testen.
Trafalmadorianer
1
Ich glaube nicht, dass es um jQuery ging. Es ist völlig unnötig, dafür eine Bibliothek zu laden. Auf diese Weise kann die neue Generation von Entwicklern nicht mehr programmieren.
FlorianB
67

Bei nicht druckbaren Tasten wie Pfeiltasten und Tastenkombinationen wie Strg-z, Strg-x, Strg-c, die möglicherweise eine Aktion im Browser auslösen (z. B. in bearbeitbaren Dokumenten oder Elementen), wird möglicherweise kein Tastendruck angezeigt Ereignis in allen Browsern. Aus diesem Grund müssen Sie keydownstattdessen verwenden, wenn Sie die Standardaktion des Browsers unterdrücken möchten. Wenn nicht, keyupwird es genauso gut tun.

Anhängen eines keydownEreignisses an documentalle gängigen Browser:

document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.ctrlKey && evt.keyCode == 90) {
        alert("Ctrl-Z");
    }
};

Als vollständige Referenz empfehle ich dringend Jan Wolters Artikel über die Handhabung von JavaScript-Schlüsseln .

Tim Down
quelle
@hendrik: Ich verstehe nicht, warum es nicht sollte, aber ich kann es derzeit nicht testen.
Tim Down
16

Tastendruck erkennen, einschließlich Tastenkombinationen:

window.addEventListener('keydown', function (e) {
  if (e.ctrlKey && e.keyCode == 90) {
    // Ctrl + z pressed
  }
});

Vorteil hierbei ist , dass Sie nicht überschreiben alle globalen Eigenschaften, sondern lediglich eine Nebenwirkung einzuführen. Nicht gut, aber definitiv viel weniger schändlich als andere Vorschläge hier.

Sal
quelle
16

Verwenden event.keySie für moderne JS !

document.addEventListener("keypress", function onPress(event) {
    if (event.key === "z" && event.ctrlKey) {
        // Do something awesome
    }
});

HINWEIS: Die alten Eigenschaften ( .keyCodeund .which) sind veraltet.

Mozilla Docs

Unterstützte Browser

Gibolt
quelle
8

Code & erkennt Strg + z

document.onkeyup = function(e) {
  if(e.ctrlKey && e.keyCode == 90) {
    // ctrl+z pressed
  }
}
Ben Rowe
quelle