Skip to main content
← ⚑ JavaScript & the browserΒ·Module C2 Β· Lesson 9
TaskHTML: <p id='out'>press Escape</p>. JS: listen on document for keydown; when event.key === 'Escape', set #out textContent to 'escape pressed' and log 'escape'.

Keyboard events: keydown, modifiers, and the Escape key

100 XP8 min
Theory

Three keyboard events

document.addEventListener("keydown",  (e) => { /* key was pressed */ });
document.addEventListener("keypress", (e) => { /* deprecated β€” don't use */ });
document.addEventListener("keyup",    (e) => { /* key was released */ });

keydown is what you want 95% of the time. It fires once when the key goes down (and repeatedly while held). keypress is deprecated. keyup is only for "did they release this combo before doing X."

event.key vs event.code

e.key   === "Escape"     // what character/name the user got
e.code  === "Escape"     // which physical key, regardless of layout
e.key   === "ArrowUp"
e.key   === "Enter"

Use event.key for "did they press Escape?" β€” works across keyboard layouts. Use event.code for "did they press the key where WASD is on QWERTY?" β€” game-style shortcuts that should survive layout swaps.

Modifier keys

if (e.metaKey  && e.key === "k") { /* Cmd+K on Mac */ }
if (e.ctrlKey  && e.key === "k") { /* Ctrl+K elsewhere */ }
if (e.shiftKey && e.key === "Enter") { /* Shift+Enter */ }

e.altKey, e.shiftKey, e.ctrlKey, e.metaKey are booleans on the event. Combine with e.key for shortcuts.

The Escape-to-close pattern

document.addEventListener("keydown", (e) => {
  if (e.key === "Escape") dialog.classList.remove("open");
});

Single source of truth for "what does Escape do." Don't sprinkle Escape handlers across components β€” one place at the document level wins.

πŸ”’

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial β€” card required, cancel anytime.

Sign up β€” free trial β†’

First 10 lessons in each track are free. No card needed for those.

← PreviousNext lesson β†’

Get one Python or web tip a day β€” by email

Short, hand-written, no spam. Unsubscribe in one click.