Keyboard Event Handling

+15 Mana ✨

Keyboard interactions are essential for accessibility and power users. Let's learn how to handle them properly in Svelte 5.

The Three Keyboard Events

svelte
<script>
  function handleKeydown(event) {
    console.log('Key pressed down:', event.key);
  }
  
  function handleKeyup(event) {
    console.log('Key released:', event.key);
  }
  
  function handleKeypress(event) {
    // Deprecated! Avoid using
    console.log('Key pressed:', event.key);
  }
</script>

<input 
  onkeydown={handleKeydown}
  onkeyup={handleKeyup}
/>

Use onkeydown for most cases - it fires immediately when a key is pressed and repeats if held.

Understanding KeyboardEvent Properties

svelte
<script>
  function handleKey(event) {
    console.log('key:', event.key);       // 'Enter', 'a', 'ArrowUp'
    console.log('code:', event.code);     // 'Enter', 'KeyA', 'ArrowUp'
    console.log('keyCode:', event.keyCode); // 13 (deprecated, don't use)
    
    // Modifier keys
    console.log('shift:', event.shiftKey);  // true/false
    console.log('ctrl:', event.ctrlKey);    // true/false
    console.log('alt:', event.altKey);      // true/false
    console.log('meta:', event.metaKey);    // true/false (Cmd on Mac)
  }
</script>

event.key - The value produced by the key ("a", "A", "Enter") event.code - The physical key on the keyboard ("KeyA" regardless of Shift)

Common Keyboard Patterns

Enter to Submit

svelte
<script>
  let value = $state('');
  
  function handleKeydown(event) {
    if (event.key === 'Enter' && !event.shiftKey) {
      event.preventDefault();
      submit();
    }
  }
</script>

<textarea onkeydown={handleKeydown} bind:value></textarea>

Escape to Close

svelte
<script>
  let isOpen = $state(false);
  
  function handleKeydown(event) {
    if (event.key === 'Escape') {
      isOpen = false;
    }
  }
</script>

<svelte:window onkeydown={handleKeydown} />

{#if isOpen}
  <div class="modal">...</div>
{/if}

Keyboard Shortcuts

svelte
<script>
  function handleKeydown(event) {
    // Ctrl+S or Cmd+S to save
    if ((event.ctrlKey || event.metaKey) && event.key === 's') {
      event.preventDefault();
      save();
    }
    
    // Ctrl+K to open search
    if ((event.ctrlKey || event.metaKey) && event.key === 'k') {
      event.preventDefault();
      openSearch();
    }
  }
</script>

<svelte:window onkeydown={handleKeydown} />

Arrow Key Navigation

svelte
<script>
  let selectedIndex = $state(0);
  let items = ['Apple', 'Banana', 'Cherry'];
  
  function handleKeydown(event) {
    switch (event.key) {
      case 'ArrowDown':
        event.preventDefault();
        selectedIndex = Math.min(selectedIndex + 1, items.length - 1);
        break;
      case 'ArrowUp':
        event.preventDefault();
        selectedIndex = Math.max(selectedIndex - 1, 0);
        break;
      case 'Enter':
        selectItem(items[selectedIndex]);
        break;
    }
  }
</script>

<ul onkeydown={handleKeydown} tabindex="0">
  {#each items as item, i}
    <li class:selected={i === selectedIndex}>{item}</li>
  {/each}
</ul>

šŸ“– Special elements documentation

āœ“ Completed