menengahdomeventkeyboardMenengah3 mnt baca

Keyboard Event: keydown, keyup, dan Shortcut

Menangkap input keyboard: perbedaan keydown/keyup, e.key vs e.code, plus contoh game geser kotak dan shortcut.

Kenapa Keyboard Event Penting?

Hampir semua aplikasi interaktif butuh keyboard: game digerakkan tombol panah/WASD, form dikirim dengan Enter, aplikasi punya shortcut seperti Ctrl+S untuk simpan. Tanpa keyboard event, user dipaksa selalu memakai mouse, melelahkan untuk pemakaian intensif. Event keyboard adalah jembatan antara jari user dan logika aplikasimu.

Contoh 1: Menampilkan Tombol yang Ditekan

javascript
document.addEventListener("keydown", (e) => {
  console.log("key:", e.key);   // karakter yang dihasilkan, misal "a", "Enter", "ArrowUp"
  console.log("code:", e.code); // posisi fisik tombol, misal "KeyA", "Enter", "ArrowUp"
});

document.addEventListener("keyup", (e) => {
  console.log("Dilepas:", e.key);
});

e.key vs e.code: e.key adalah karakter yang dihasilkan tombol (tergantung layout keyboard dan Shift: tombol yang sama bisa menghasilkan "a" atau "A"). e.code adalah posisi fisik tombol di keyboard (selalu "KeyA" walau layout-nya Dvorak atau AZERTY). Untuk game, pakai e.code supaya kontrol konsisten di semua layout. Untuk input teks, pakai e.key.

Contoh 2: Game Geser Kotak + Shortcut

html
<div id="kotak" style="width:50px;height:50px;background:violet;position:absolute;"></div>
javascript
const kotak = document.getElementById("kotak");
let x = 0, y = 0;

document.addEventListener("keydown", (e) => {
  // Shortcut: Ctrl+S untuk simpan (cegah dialog save browser!)
  if (e.ctrlKey && e.key === "s") {
    e.preventDefault();
    console.log("Posisi tersimpan!");
    return;
  }

  const langkah = 10;
  if (e.code === "ArrowRight") x += langkah;
  if (e.code === "ArrowLeft") x -= langkah;
  if (e.code === "ArrowDown") y += langkah;
  if (e.code === "ArrowUp") y -= langkah;

  kotak.style.transform = "translate(" + x + "px," + y + "px") ;

  // Cegah halaman scroll saat tombol panah ditekan
  if (e.code.startsWith("Arrow")) e.preventDefault();
});

Perhatikan e.preventDefault(): browser punya aksi bawaan (panah = scroll, Ctrl+S = dialog save). Kalau aplikasimu mengambil alih tombol itu, kamu wajib membatalkan aksi bawaannya.

Jebakan Umum

1. keypress sudah usang, jangan dipakai. Event keypress deprecated dan tidak konsisten antar browser. Pakai keydown (saat ditekan) dan keyup (saat dilepas).

2. keyCode usang, pakai key atau code. e.keyCode memberi angka misterius (13, 65...) yang tidak readable. Sudah deprecated, jangan dipakai di kode baru.

3. Tombol yang ditahan memicu keydown berulang (key repeat). Kalau game-mu menambah skor tiap keydown, menahan tombol bisa menambah skor berkali-kali. Cek e.repeat untuk mengabaikannya:

javascript
document.addEventListener("keydown", (e) => {
  if (e.repeat) return; // abaikan pengulangan saat tombol ditahan
  console.log("Sekali saja:", e.key);
});

4. Event tidak jalan saat fokus di input. Kalau user sedang mengetik di <input>, keydown tetap fire tapi e.target-nya input. Untuk shortcut global, cek e.target.tagName dan lewati jika sedang mengetik, supaya shortcut tidak mengganggu.

Ringkasan

Pakai keydown/keyup, baca e.key untuk karakter dan e.code untuk posisi fisik tombol. Ingat preventDefault() untuk mengambil alih aksi bawaan browser, waspadai key repeat lewat e.repeat, dan tinggalkan keypress/keyCode di masa lalu.

Live Playground
export default function App(): JSX.Element {
  return <h1>Hello world</h1>
}

Edit kode di kiri, preview kanan ter-update otomatis.

Tantangan

Konami Mini: Urutan Rahasia

Di dunia nyata, urutan tombol rahasia (cheat code, easter egg) dan shortcut keyboard adalah cara aplikasi memberi kejutan atau akses cepat ke power user. Menghafal dan mencocokkan urutan input adalah pola yang dipakai game dan aplikasi pro. Buat pendeteksi urutan rahasia: jika user menekan panah Atas, Atas, Bawah, Bawah (pakai e.code), tampilkan pesan "Kode rahasia terbuka!" di halaman. Urutan harus direset jika salah tekan.

<!doctype html>
<html>
<head>
<meta charset="utf-8" />

</head>
<body>
<h1>Halo JS</h1>
<p>Buka console preview untuk melihat output.</p>
<script src="index.js"></script>
</body>
</html>

Kuis Bab

Uji pemahamanmu: DOM: Mengendalikan Halaman Web

Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".

1.Mengapa event delegation disarankan untuk daftar item yang dinamis, misalnya hasil pencarian?

2.Kapan kamu harus memakai textContent daripada innerHTML?

3.Apa perbedaan querySelectorAll dan getElementsByClassName terkait hasil yang dikembalikan?

4.Mengapa form sering memakai event.preventDefault() di handler submit?

5.Mengapa mengubah class lewat classList lebih disarankan daripada mengatur style langsung satu per satu?