- Bab 6 dari 12
- 30 menit
- 1 latihan kode
- 4 soal kuis
DOM dan Event
Di bab ini (8 bagian)
Tujuan bab ini
- Memahami apa itu DOM dan kenapa JavaScript bisa mengubah halaman web.
- Memilih elemen dengan
querySelectordanquerySelectorAll, lalu mengubah teks, class, dan style-nya. - Membuat elemen baru dan menambahkannya ke halaman.
- Menangani event
click,input, dansubmitdenganaddEventListener, termasuk event object,preventDefault, dan event delegation.
Apa itu DOM?
Saat browser membuka file HTML, ia tidak menyimpan HTML itu sebagai teks. Browser mengubahnya menjadi pohon objek bernama DOM (Document Object Model). Setiap tag menjadi sebuah node yang punya induk, anak, dan saudara, mirip silsilah keluarga.
Di pohonnya, body adalah induk dari h1 dan ul, lalu ul adalah induk dari dua li. Pintu masuk ke pohon ini adalah objek global document. Lewat document, JavaScript bisa membaca elemen, mengubah isinya, atau menambah elemen baru, dan browser langsung menggambar ulang halaman.
Penting: document dan window hanya ada di browser. Kalau kamu menjalankan kode DOM dengan Node.js di terminal, hasilnya ReferenceError: document is not defined.
Memilih elemen
Dua method ini menerima selector CSS, jadi apa yang kamu tulis di CSS juga berlaku di sini.
querySelectormengembalikan elemen pertama yang cocok, ataunullkalau tidak ada.querySelectorAllmengembalikanNodeListberisi semua elemen yang cocok. NodeList bisa di-forEach, tapi bukan array asli; pakaiArray.from(...)kalau butuhmapataufilter.
Mengubah elemen
Setelah elemennya didapat, kamu bisa mengubah banyak hal:
| Properti | Isinya | Kapan dipakai |
|---|---|---|
textContent | Teks murni | Menampilkan data, terutama dari input pengguna |
innerHTML | Teks yang dibaca sebagai HTML | Menyusun potongan HTML milikmu sendiri |
classList | Daftar class | Mengganti tampilan lewat CSS |
style | Style inline | Perubahan kecil yang dinamis |
Kenapa textContent lebih aman untuk input pengguna? Karena innerHTML menjalankan apa pun sebagai HTML. Kalau seseorang mengetik tag berbahaya, misalnya <img src=x onerror="...">, kodenya bisa ikut jalan. Ini celah keamanan bernama XSS. Untuk mengubah tampilan, classList biasanya lebih rapi daripada style, karena aturan tampilannya tetap tinggal di file CSS.
Membuat elemen baru
Langkahnya selalu tiga: buat elemen, isi (teks, class, atribut), lalu pasang ke pohon dengan appendChild atau append. Sebelum dipasang, elemen itu sudah ada di memori tapi belum terlihat di halaman. Untuk menghapus elemen, panggil item.remove().
Event: bereaksi terhadap pengguna
Event adalah sinyal bahwa sesuatu terjadi: tombol diklik, teks diketik, form dikirim. Kamu memasang "pendengar" dengan addEventListener(jenisEvent, callback). Callback ini baru dijalankan saat event terjadi, bukan saat baris itu dibaca.
Urutan kejadiannya: saat halaman dimuat, kode di atas hanya mendaftarkan callback, belum ada yang dihitung. Setiap kali pengguna mengklik, browser memanggil callback itu, total bertambah satu, lalu teks di layar diperbarui. Variabel total tetap tersimpan di antara klik karena callback adalah closure yang mengingat variabel di luarnya. Pola "simpan state di variabel, lalu tulis ke DOM" ini adalah dasar dari hampir semua interaksi, dari tombol like sampai keranjang belanja.
Event object
Browser selalu mengirim satu argumen ke callback: event object, biasanya dinamai e atau event. Isinya informasi tentang kejadian itu. Yang paling sering dipakai adalah e.target, yaitu elemen tempat event terjadi.
Event input berjalan setiap kali isi kolom berubah, jadi pratinjau ikut berubah saat kamu mengetik, huruf demi huruf.
submit dan preventDefault
Secara bawaan, form yang dikirim akan memuat ulang halaman. Di aplikasi modern kita biasanya ingin mengolah datanya dengan JavaScript, jadi perilaku bawaan itu dibatalkan dengan e.preventDefault().
Pasang listener submit di form, bukan click di tombolnya. Dengan begitu, menekan Enter di kolom input juga ikut tertangani.
Event delegation singkat
Bayangkan daftar tugas yang item-nya terus bertambah. Memasang listener ke setiap li merepotkan, apalagi untuk item yang dibuat belakangan. Karena event "menggelembung" (bubbling) dari elemen anak ke induknya, kamu cukup memasang satu listener di induk:
e.target memberi tahu item mana yang sebenarnya diklik, dan matches memastikan yang diklik memang li. Item baru otomatis ikut tertangani tanpa listener tambahan.
Kesalahan umum
- Script jalan sebelum HTML siap.
querySelectormenghasilkannullkarena elemennya belum dibuat. Taruh<script>di akhirbodyatau pakai atributdefer. - Memanggil callback saat mendaftarkannya.
addEventListener("click", tambah())menjalankantambahsekali, lalu mendaftarkan hasilnya. Tulistambahtanpa kurung. - Lupa
preventDefaultdi submit. Halaman reload dan semua data di layar hilang. - Memakai
innerHTMLuntuk teks dari pengguna. PakaitextContentsupaya aman dari XSS. - Menganggap
textContentberupa angka. Isinya selalu string; ubah denganNumber(...)sebelum menghitung.
Rangkuman
- DOM adalah pohon objek dari HTML, diakses lewat
document, dan hanya tersedia di browser. querySelectormengambil elemen pertama yang cocok,querySelectorAllmengambil semuanya.- Ubah elemen lewat
textContent,innerHTML,classList, danstyle; buat elemen baru dengancreateElementlalu pasang denganappendChild. addEventListenermenjalankan callback saat event terjadi; event object membawatargetdanpreventDefault.- Event delegation memakai bubbling: satu listener di induk menangani semua anak, termasuk yang baru dibuat.
Slide 13 sampai 13 dari deck JavaScript. Penjelasan lengkapnya ada di mode Baca.

Selesaikan bab ini
- 1. Baca materi
- 2. Latihan kode (1)
- 3. Kuis (4 soal)
Latihan kode: Tombol penghitung
Buat penghitung yang hidup dengan addEventListener:
- Tombol
#tambahmenaikkan angka di#hitungsebesar 1. - Tombol
#kurangmenurunkan angka sebesar 1. - Tombol
#resetmengembalikan angka ke0. - Saat angka di bawah 0,
#hitungmendapat classnegatif(warnanya merah). Saat angka 0 atau lebih, class itu dilepas.
Simpan angkanya di variabel, lalu tulis ke layar dengan textContent.
Cek pemahaman
1Apa yang dikembalikan document.querySelector(".kartu") bila tidak ada elemen yang cocok?
2Kode DOM seperti document.querySelector bisa langsung dijalankan dengan Node.js di terminal.
3Apa yang ditampilkan kode berikut?
const p = document.createElement("p"); p.classList.add("a"); p.classList.toggle("b"); p.classList.toggle("a"); console.log(p.className);4Untuk apa e.preventDefault() dipanggil di dalam listener submit?