Chapter sebelumnya mengajarkan cara memilih elemen DOM, mengubah teksnya, dan mengganti class-nya, tetapi seluruh perubahan itu berjalan sekali saat skrip dieksekusi. Halaman baru terasa hidup ketika ia merespons kejadian dari pengunjung: tombol ditekan, tautan disentuh, atau formulir dikirim. Browser memancarkan sinyal bernama event untuk setiap kejadian tersebut, dan JavaScript dapat mendaftar sebagai pendengar yang meresponsnya. Chapter ini membahas event yang paling sering dipakai, yaitu click, beserta pola pemasangan listener yang menjadi dasar hampir semua interaksi.
Event dan Callback #
Event adalah kejadian yang terjadi pada halaman, misalnya klik pada tombol, gerakan kursor, atau penekanan tombol keyboard. Browser terus memantau kejadian tersebut; ketika satu kejadian terjadi pada suatu elemen, browser menjalankan seluruh fungsi yang terdaftar sebagai pendengar (listener) untuknya. Fungsi yang didaftarkan ini disebut callback, karena browser yang memanggilnya kembali pada saat yang tepat, bukan kode kita yang memanggilnya langsung.
Cara modern untuk mendaftarkan listener adalah method addEventListener pada elemen:
const tombol = document.querySelector("#simpan");
tombol.addEventListener("click", function () {
console.log("Tombol simpan ditekan!");
});Method tersebut menerima dua argumen: string nama event ("click") dan fungsi callback yang akan dijalankan setiap kali event terjadi. Setiap penekanan tombol memicu pemanggilan callback kembali, dan satu elemen boleh memiliki banyak listener untuk event yang sama.
addEventListener atau Atribut onclick #
HTML menyediakan cara lain yang lebih tua, yaitu atribut onclick yang ditulis langsung pada tag:
<button type="button" onclick="tampilkanSalam()">Sapa pengunjung</button>Dengan atribut tersebut, fungsi tampilkanSalam() dipanggil setiap tombol ditekan. Perilakunya benar, tetapi praktik ini menggabungkan perilaku ke dalam markup, seperti CSS inline: struktur dan logika bercampur dalam satu baris. Tabel berikut merangkum perbandingannya:
| Aspek | addEventListener | Atribut onclick |
|---|---|---|
| Letak kode | File JavaScript, terpisah dari markup | Tertulis di dalam tag HTML |
| Jumlah listener | Banyak listener untuk satu event | Satu saja; nilai berikutnya menimpa yang lama |
| Pemisahan tanggung jawab | Terjaga, sejalan dengan HTML vs CSS | Perilaku bercampur dengan struktur |
| Rekomendasi | Dianjurkan | Hanya untuk percobaan cepat |
Listener yang dipasang lewat addEventListener menjaga pemisahan tanggung jawab tersebut. Gunakan atribut onclick hanya saat membaca kode lama milik orang lain.
Objek Event, this, dan target #
Setiap kali event terjadi, browser membuat satu objek event dan mengirimkannya sebagai argumen pertama callback. Objek ini lazim dinamai event atau disingkat e dan membawa keterangan tentang kejadian yang baru berlangsung:
tombol.addEventListener("click", function (event) {
console.log(event.target.textContent);
});Properti event.target menunjuk elemen tempat kejadian berasal — pada contoh di atas, tombolnya sendiri. Kata kunci this di dalam callback yang ditulis sebagai function biasa merujuk ke elemen yang dipasangi listener, sehingga pada kasus klik langsung this dan event.target berujung menunjuk objek yang sama. Kegunaan event.target yang berbeda dari this muncul pada event yang menyebar dari elemen anak ke elemen induk.
Contoh: Penghitung Klik #
Kita rangkai semuanya menjadi satu alat kecil: tombol penghitung yang memperbarui angka pada halaman setiap kali ditekan. File penghitung-klik.html menyediakan struktur dan tempat skrip dipasang:
<!doctype html>
<html lang="id">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Penghitung Klik</title>
<script src="penghitung-klik.js" defer></script>
</head>
<body>
<h1>Penghitung Klik</h1>
<p>Tombol telah ditekan <span id="jumlah">0</span> kali.</p>
<button id="tombol-tambah" type="button">Tambah satu</button>
</body>
</html>Perilakunya ditulis di file terpisah penghitung-klik.js:
const tombol = document.querySelector("#tombol-tambah");
const jumlah = document.querySelector("#jumlah");
let hitungan = 0;
function tanganiKlik() {
hitungan = hitungan + 1;
jumlah.textContent = hitungan;
}
tombol.addEventListener("click", tanganiKlik);Output yang Dihasilkan:
Jendela browser menampilkan:
- Heading "Penghitung Klik" dan kalimat "Tombol telah ditekan 0 kali."
- Tombol berlabel "Tambah satu"
Setiap klik pada tombol:
- Angka pada kalimat naik satu: 1, 2, 3, dan seterusnyaMari kita bedah kedua file itu:
- Baris 7 HTML (
<script src="penghitung-klik.js" defer>): skrip dimuat dari file terpisah dengan atributdefersehingga dieksekusi setelah dokumen selesai diurai — pola dari chapter Script dan Defer. - Baris 11-12 HTML (
<span id="jumlah">dan<button id="tombol-tambah">): dua elemen diberiidagar mudah dipilih dari JavaScript. - Baris 1-2 JS (
querySelector): kode memilih tombol dan span, lalu menyimpan referensinya di duaconst. - Baris 3 JS (
let hitungan = 0;): nilai awal penghitung.letdipakai, bukanconst, karena angka ini berubah; elemen yang tidak diganti tetap memakaiconst. - Baris 5-8 JS (function
tanganiKlik): callback bernama yang menaikkanhitungansebanyak satu, lalu menuliskan angka terbaru kespanmelaluitextContent— teknik dari chapter Mengubah Teks Elemen. - Baris 10 JS (
addEventListener): menghubungkan tombol dengan callback. Setiap klik memicu pemanggilantanganiKlik, sehingga angka pada halaman ikut naik.
Chapter berikutnya melanjutkan ke kejadian yang lebih halus: perubahan isian pada elemen form, yang terpicu bukan sekali per klik, melainkan setiap kali nilainya berganti.
Referensi resmi untuk pendalaman:
- MDN Web Docs — EventTarget: addEventListener()
- MDN Web Docs — Pengantar events (Learn)
- MDN Web Docs — Event
- MDN Web Docs — EventTarget: removeEventListener()
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
penghitung-klik.html
Unduh berkas<!doctype html>
<html lang="id">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Penghitung Klik</title>
<script src="penghitung-klik.js" defer></script>
</head>
<body>
<h1>Penghitung Klik</h1>
<p>Tombol telah ditekan <span id="jumlah">0</span> kali.</p>
<button id="tombol-tambah" type="button">Tambah satu</button>
</body>
</html>
penghitung-klik.js
Unduh berkasconst tombol = document.querySelector("#tombol-tambah");
const jumlah = document.querySelector("#jumlah");
let hitungan = 0;
function tanganiKlik() {
hitungan = hitungan + 1;
jumlah.textContent = hitungan;
}
tombol.addEventListener("click", tanganiKlik);