JavaScript keydown und keyup Events
JavaScript-Tastaturereignisse: Unterschiede zwischen keydown und keyup, das KeyboardEvent-Objekt (key vs. code, Modifier-Flags, repeat) sowie Beispiele für Shortcuts, Spielsteuerung und barrierefreie Navigation.
Einführung in Tastaturereignisse in JavaScript
JavaScript-Tastaturereignisse ermöglichen es Ihrer Seite, sofort zu reagieren, wenn ein Benutzer eine Taste drückt oder loslässt. Sie bilden die Grundlage für Such-Eingaben in Echtzeit, Tastaturkürzel, Spielsteuerungen und barrierefreie Navigation. Dieses Kapitel konzentriert sich auf die zwei Ereignisse, die Sie am häufigsten verwenden werden — keydown und keyup — erklärt ihre Unterschiede, erläutert das KeyboardEvent-Objekt, das jeder Handler empfängt, und schließt mit praktischen, ausführbaren Beispielen ab.
Wenn Sie neu im Umgang mit Ereignissen sind, beginnen Sie zunächst mit Einführung in Browser-Events und Event-Handling im DOM.
keydown vs. keyup auf einen Blick
Beide Ereignisse werden auf dem Element ausgelöst, das gerade den Fokus hat (oder auf document, wenn kein bestimmtes Element fokussiert ist). Der Unterschied liegt darin, wann im Lebenszyklus einer Taste sie ausgelöst werden:
| Ereignis | Wird ausgelöst, wenn… | Wiederholt beim Gedrückthalten? | Typische Verwendung |
|---|---|---|---|
keydown | Eine Taste gedrückt wird | Ja — wiederholt | Shortcuts, Spielbewegung, Eingabe verhindern |
keyup | Eine Taste losgelassen wird | Nein — einmal pro Tastendruck | Erkennen des Endes eines Tastendrucks, UI aktualisieren |
Ein einzelnes Drücken einer Taste erzeugt ein keydown und dann ein keyup. Wenn eine Taste gedrückt gehalten wird, wird keydown immer wieder ausgelöst (diese automatischen Wiederholungen können Sie mit event.repeat erkennen), aber keyup wird nur einmal ausgelöst, wenn Sie die Taste schließlich loslassen.
Das veraltete
keypress-Ereignis ist veraltet und sollte in neuem Code nicht verwendet werden. Um auf den Text zu reagieren, den ein Benutzer tippt, verwenden Sie stattdessen dasinput-Ereignis.
keydown und keyup verstehen
Das keydown-Ereignis
Das keydown-Ereignis tritt auf, wenn ein Benutzer eine Taste auf der Tastatur drückt. Es wird vor dem Einfügen des Zeichens in ein Feld ausgelöst, weshalb es genau der richtige Ort ist, um event.preventDefault() aufzurufen, wenn Sie eine Eingabe blockieren möchten. Dieses Ereignis ist immer dann nützlich, wenn der Zeitpunkt des Drückens wichtig ist — bei Spielen, Barrierefreiheitsfunktionen oder interaktiven Steuerelementen.
Beispiel für das keydown-Ereignis
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Example of Keydown Event</title>
<style>
.highlight { background-color: yellow; }
</style>
<script>
document.addEventListener('DOMContentLoaded', function () {
const inputField = document.getElementById('inputField');
inputField.addEventListener('keydown', function(event) {
console.log('Key down:', event.key);
if (event.key === "Enter") {
this.classList.add('highlight');
event.preventDefault(); // Prevents the default action of the enter key
}
});
});
</script>
</head>
<body>
<input type="text" id="inputField" placeholder="Press 'Enter' to highlight" />
</body>
</html>Der Code lauscht auf ein keydown-Ereignis am Eingabefeld und prüft, ob die gedrückte Taste "Enter" ist. Wenn ja, ändert er die Hintergrundfarbe des Eingabefelds auf Gelb (Klasse highlight) und verhindert die standardmäßige Formularübermittlung oder andere Aktionen, die typischerweise mit der Enter-Taste verbunden sind.
Das keyup-Ereignis
Das keyup-Ereignis wird ausgelöst, wenn eine Taste losgelassen wird, nach dem keydown-Ereignis (Hinweis: das veraltete keypress-Ereignis ist veraltet und wird in der modernen Webentwicklung kaum noch verwendet). Dieses Ereignis eignet sich für Fälle, in denen Sie wissen möchten, wann ein Tastendruck abgeschlossen ist, beispielsweise beim Aktualisieren einer Benutzeroberfläche oder beim Steuern von Multimedia-Inhalten.
Beispiel für das keyup-Ereignis
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Example of Keyup Event</title>
<style>
.normal { background-color: transparent; }
.active { background-color: lightgreen; }
</style>
<script>
document.addEventListener('DOMContentLoaded', function () {
const textArea = document.getElementById('textArea');
textArea.addEventListener('keyup', function(event) {
console.log('Key up:', event.key);
if (event.key === "Control") {
this.classList.remove('active');
this.classList.add('normal');
}
});
textArea.addEventListener('keydown', function(event) {
if (event.key === "Control") {
this.classList.add('active');
}
});
});
</script>
</head>
<body>
<textarea id="textArea" rows="4" cols="50" placeholder="Press and release 'Control' to see the effect"></textarea>
</body>
</html>Dieser Code lässt den Textbereich seine Hintergrundfarbe auf Hellgrün (Klasse active) wechseln, wenn die Control-Taste gedrückt wird, und setzt sie auf transparent (Klasse normal) zurück, wenn die Control-Taste losgelassen wird.
Das KeyboardEvent-Objekt
Jeder keydown- und keyup-Handler empfängt ein KeyboardEvent. Die Kenntnis seiner wichtigsten Eigenschaften ermöglicht es Ihnen, zuverlässige Tastaturlogik zu schreiben.
key vs. code
Diese beiden Eigenschaften sind leicht zu verwechseln, und die Wahl der falschen ist die häufigste Ursache für Tastaturfehler:
event.key— der Zeichen- oder benannte Wert, der erzeugt wird, entsprechend dem Tastaturlayout und den Modifikatoren. Das Drücken der TasteAergibt"a", oder"A"mit gedrückter Shift-Taste. Benannte Tasten:"Enter","Escape","ArrowLeft"," "(Leerzeichen).event.code— die physische Taste auf der Tastatur, unabhängig von Layout oder Modifikatoren. Dieselbe physische Taste ist immer"KeyA", egal ob der Benutzera,Atippt oder ein Nicht-QWERTY-Layout verwendet.
Verwenden Sie key, wenn es Ihnen um das Zeichen geht (Texteingabe, Shortcuts, die dem Benutzer angezeigt werden). Verwenden Sie code, wenn es Ihnen um die Position geht — zum Beispiel WASD-Spielsteuerungen, die unabhängig vom Layout funktionieren sollen.
document.addEventListener('keydown', function (event) {
console.log(event.key, event.code);
});
// Pressing Shift+A on QWERTY logs: "A" "KeyA"
// Pressing the space bar logs: " " "Space"Modifikatortasten und Wiederholung
Das Ereignis gibt auch an, welche Modifikatortasten gedrückt sind und ob der Tastendruck eine automatische OS-Wiederholung ist:
event.altKey,event.ctrlKey,event.shiftKey,event.metaKey— boolean-Werte,truesolange der jeweilige Modifikator gedrückt ist. (metaKeyist Cmd auf macOS, die Windows-Taste anderswo.)event.repeat—true, wenn eine gehaltene Tastekeydownautomatisch erneut auslöst. Prüfen Sie dies, um automatische Wiederholungen zu ignorieren.
document.addEventListener('keydown', function (event) {
// Cross-platform "save" shortcut, ignoring auto-repeat.
if ((event.ctrlKey || event.metaKey) && event.key === 's' && !event.repeat) {
event.preventDefault();
console.log('Save triggered');
}
});Das direkte Lesen der Modifikator-Flags (wie oben) ist robuster als das Verfolgen einer separaten ctrlPressed-Variable, weil die Flags garantiert mit der Realität synchron sind, selbst wenn ein keyup verpasst wird.
Erweiterte Verwendung von Tastaturereignissen in JavaScript
Die Nutzung der Möglichkeiten von Tastaturereignissen wie keydown und keyup kann gewöhnliche Webanwendungen in hochinteraktive, barrierefreie und effiziente Plattformen verwandeln. Im Folgenden werden ihre Verwendungsmöglichkeiten durch komplexere Szenarien wie benutzerdefinierte Hotkeys, Spielsteuerungen und Barrierefreiheitsfunktionen erweitert.
Benutzerdefinierte Hotkeys implementieren
Benutzerdefinierte Hotkeys ermöglichen es Benutzern, Aktionen schnell auszuführen, was die Produktivität und Benutzererfahrung verbessert. Dieses Beispiel zeigt, wie ein einfacher benutzerdefinierter Hotkey (Ctrl + S) erstellt wird, um eine Speicheraktion zu simulieren, die an spezifische Funktionen in echten Anwendungen angepasst werden könnte.
Beispiel für benutzerdefinierte Hotkeys
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Custom Hotkeys Example</title>
<script>
document.addEventListener('DOMContentLoaded', function () {
let ctrlPressed = false;
document.addEventListener('keydown', function(event) {
if (event.key === "Control") {
ctrlPressed = true;
}
// Use toLowerCase() for case-insensitive matching
if (event.key.toLowerCase() === "s" && ctrlPressed) {
alert('Saving your progress!');
event.preventDefault(); // Prevent default to stop other actions like browser shortcuts
}
});
document.addEventListener('keyup', function(event) {
if (event.key === "Control") {
ctrlPressed = false;
}
});
});
</script>
</head>
<body>
<p>Press <strong>Ctrl + S</strong> to simulate a save action.</p>
</body>
</html>Spielsteuerungen verwalten
Spielsteuerungen sind entscheidend für browserbasierte Spiele. Dieses Beispiel bietet eine einfache Implementierung von Pfeiltasten-Steuerungen zum Bewegen eines Spielerobjekts innerhalb eines Spielbereichs und stellt ein grundlegendes Framework bereit, das zu komplexeren Spielmechaniken ausgebaut werden kann.
Beispiel für Spielsteuerungen
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Game Control Example</title>
<style>
#gameArea {
width: 300px;
height: 300px;
border: 1px solid black;
position: relative;
}
#player {
width: 50px;
height: 50px;
background-color: red;
position: absolute;
top: 125px;
left: 125px;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function () {
const player = document.getElementById('player');
// Note: offsetLeft/Top don't account for container padding or scroll offsets.
// For production, consider using getBoundingClientRect() or adding padding offsets.
let posX = player.offsetLeft;
let posY = player.offsetTop;
document.addEventListener('keydown', function(event) {
switch (event.key) {
case "ArrowUp":
posY -= 10;
break;
case "ArrowDown":
posY += 10;
break;
case "ArrowLeft":
posX -= 10;
break;
case "ArrowRight":
posX += 10;
break;
}
player.style.left = posX + 'px';
player.style.top = posY + 'px';
});
});
</script>
</head>
<body>
<div id="gameArea">
<div id="player"></div>
</div>
<p>Use arrow keys to move the red square within the game area.</p>
</body>
</html>Barrierefreiheit verbessern
Verbesserungen der Barrierefreiheit helfen dabei, Webanwendungen für Menschen mit Behinderungen nutzbar zu machen. Dieses Beispiel konzentriert sich auf die Verwendung von keydown-Ereignissen zur Navigation durch Links mithilfe der Pfeiltasten der Tastatur, was eine tastaturgesteuerte Navigation für Benutzer erleichtert, die keine Maus verwenden können.
Beispiel für Barrierefreiheits-Verbesserung
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Accessibility Navigation Example</title>
<script>
document.addEventListener('DOMContentLoaded', function () {
const links = document.querySelectorAll('a');
let currentFocus = 0;
links[currentFocus].focus();
document.addEventListener('keydown', function(event) {
if (event.key === "ArrowDown") {
currentFocus = (currentFocus + 1) % links.length;
links[currentFocus].focus();
event.preventDefault();
}
if (event.key === "ArrowUp") {
currentFocus = (currentFocus - 1 + links.length) % links.length;
links[currentFocus].focus();
event.preventDefault();
}
});
});
</script>
</head>
<body>
<nav>
<a href="#home">Home</a>
<a href="#about">About</a>
<a href="#services">Services</a>
<a href="#contact">Contact</a>
</nav>
<p>Use the Up and Down arrow keys to navigate between the links.</p>
</body>
</html>Diese Beispiele veranschaulichen nicht nur die technische Implementierung von keydown- und keyup-Ereignissen, sondern demonstrieren auch ihre praktischen Anwendungen zur Verbesserung der Interaktivität und Barrierefreiheit von Webanwendungen. Durch die Integration dieser erweiterten Funktionalitäten können Entwickler ansprechendere und inklusivere Benutzererfahrungen schaffen.
Fazit
Tastaturereignisse wie keydown und keyup sind unverzichtbar für die Erstellung dynamischer und interaktiver Webanwendungen. Merken Sie sich das Wesentliche: keydown wird beim Drücken ausgelöst (und wiederholt), keyup wird einmal beim Loslassen ausgelöst, event.key liefert das Zeichen, während event.code die physische Taste liefert, und die Modifikator-Flags zusammen mit event.repeat ermöglichen den Aufbau robuster Shortcuts. Die obigen Beispiele sind ein Ausgangspunkt, um Tastaturinteraktionen in Ihre eigenen Projekte einzubinden.
Verwandte Kapitel
- Einführung in Browser-Events — wie Ereignisse auf hoher Ebene funktionieren.
- Event-Handling im DOM —
addEventListener, Handler und Entfernung. - Events: change, input, cut, copy, paste — auf den Text reagieren, der tatsächlich in einem Feld landet.
- Fokussierung: focus und blur — passt natürlich zur Tastaturnavigation.
- Bubbling und Capturing — wie sich Tastaturereignisse durch den DOM verbreiten.