DOM Advanced — JavaScript

Dasar DOM ngajarin kamu cara baca-tulis elemen satu-satu. Tapi pas aplikasi membesar — list to-do dengan 100 item, chat dengan ribuan pesan — pendekatan…

DOM adalah halaman web versi JavaScript: tiap tag jadi elemen yang bisa dibaca dan diubah. Di lesson ini kamu bikin elemen baru dari JavaScript, menghapusnya, mengatur class-nya, dan memasang satu listener buat banyak elemen sekaligus. Ini dasar daftar yang bisa bertambah, kayak to-do list atau kolom chat.

🧪 Tebakan cepat: kamu pasang listener klik di tiap <li>, lalu menambah <li> baru. Item baru itu ikut bereaksi waktu diklik atau gak? Tebak dulu, jawabannya ada di bagian "Satu listener buat semua item: event delegation".

Bikin elemen baru dengan createElement dan appendChild

HTML-nya cuma <ul id="list"></ul> yang masih kosong:

const list = document.querySelector('#list')

const li = document.createElement('li')
li.textContent = 'Belajar DOM'
list.appendChild(li)

Hasilnya halaman berisi <ul id="list"><li>Belajar DOM</li></ul>. list.append(li) juga boleh, kerjanya sama.

Tiap appendChild menambah di paling bawah, jadi yang dimasukkan duluan tampil paling atas. Butuh beberapa item? Ulangi tiga langkah tadi, misalnya pakai loop:

for (let i = 1; i <= 2; i++) {
  const li = document.createElement('li')
  li.textContent = 'Tugas ' + i
  list.appendChild(li)
}

Hasilnya dua item baru: Tugas 1 lalu Tugas 2. Tiap putaran harus bikin li baru, karena satu elemen cuma bisa ada di satu tempat.

Menghapus elemen

Cari elemennya, lalu panggil remove():

const item = document.querySelector('#hapus-ini')
item.remove()

Cara lama yang masih sering kelihatan: item.parentNode.removeChild(item), artinya "induknya, tolong buang anak ini".

Mengatur class dengan classList

Class biasanya dipakai CSS buat mengubah tampilan, misalnya item yang selesai dicoret. classList mengatur class satu per satu:

classList.add gak mengganggu class lain yang sudah ada. Beda dengan el.className = 'done', yang menimpa semuanya.

Satu listener buat semua item: event delegation

Klik di sebuah <li> gak berhenti di situ. Klik itu naik ke induknya, <ul>, lalu terus ke atas. Jadi cukup satu listener di <ul> buat menangkap klik di semua <li>:

list.addEventListener('click', (e) => {
  if (e.target.tagName === 'LI') {
    e.target.classList.add('done')
  }
})

Isi listener baru jalan waktu ada klik, jadi sebelum diklik belum ada item yang bertanda. Cara ini disebut event delegation. Jawaban tebakan: dengan listener di tiap <li>, item baru gak ikut, karena dia belum ada waktu listener-nya dipasang. Dengan delegation, item baru langsung ikut, karena listener-nya ada di <ul>.

⚠️ Jebakan yang sering ketemu

🔬 Coba sendiri

Tempel potongan HTML dan lihat strukturnya sebagai pohon: induk, anak, dan saudara. Pohon inilah yang dijalani klik waktu naik dari <li> ke <ul>.

TL;DR: document.createElement('li') bikin elemen, textContent mengisi teksnya, parent.appendChild(li) menampilkannya di paling bawah. el.remove() menghapus. classList.add, remove, toggle dan contains mengatur class satu per satu. Event delegation: satu listener di induk, lalu e.target memberi tahu anak mana yang diklik, termasuk anak yang ditambah belakangan.

Yang akan kamu pelajari