Navigasi:  |  Demo: Space
DOM
JS
HTML
CSS
WEB
BAB 11

BAB 11
DOM MANIPULATION

Front End Masterclass

KELAS 10 · SEMESTER 1 · USIA 15–16 TAHUN

2
Tujuan Pembelajaran
Orientasi

Setelah menyelesaikan bab ini, kamu akan mampu:

Memahami konsep DOM sebagai struktur pohon dari halaman web.
Mencari elemen dengan getElementById, querySelector & querySelectorAll.
Mengubah isi & gaya elemen dengan innerHTML, textContent & classList.
Menanggapi interaksi pengguna dengan addEventListener.
Memvalidasi form dan menampilkan pesan error secara dinamis.
Membuat konten dinamis: kartu, modal, dark mode, dan daftar tugas.
Membangun Mini Project aplikasi To-Do List dari nol.
3
Apa itu DOM?
Konsep
DOM = Document Object Model. Yaitu representasi halaman HTML dalam bentuk pohon objek yang bisa dibaca & diubah oleh JavaScript.
🎯 ANALOGI
"DOM itu seperti Daftar Isi buku yang HIDUP — setiap bab, sub-bab, dan halaman adalah elemen yang bisa kamu ubah kapan saja."
<html>
<head>
<title>
<body>
<h1>
<p>

Saat browser membuka halaman, ia membaca HTML lalu membangun pohon DOM. Akarnya adalah document, lalu bercabang ke <html>, <head> dan <body>. Setiap elemen menjadi node yang bisa kita ambil dan ubah lewat JavaScript. Coba klik node di pohon di samping!

dom.js
// Mengakses & mengubah elemen lewat DOM
const judul = document.getElementById('judul');
judul.textContent = 'Halo DOM!';
🌳 Demo: Lihat Pohon DOM
Klik tombol untuk melihat bagaimana HTML diubah menjadi pohon DOM…
4
getElementById()
Selektor
Mencari TEPAT 1 elemen berdasarkan ID unik. ID harus berbeda di seluruh halaman.
🎯 ANALOGI
"Seperti mencari seseorang di sekolah berdasarkan Nomor Induk Siswa (NIS) — pasti ketemu 1 orang saja."

getElementById adalah cara tercepat & paling pasti untuk mengambil satu elemen. Ia mengembalikan elemen itu sendiri, atau null jika ID tidak ditemukan.

byid.js
const el = document.getElementById('nama-siswa');
el.style.color = 'gold';
🔦 Demo: Sorot berdasarkan ID

Ketik ID lalu lampu sorot mencari elemennya. (coba: nis-12)

Menunggu pencarian…
5
querySelector()
Selektor
Mencari elemen PERTAMA yang cocok dengan CSS selector (boleh class, tag, id, atau kombinasi).
🎯 ANALOGI
"Seperti berteriak 'Yang pakai baju merah, maju!' — hanya orang PERTAMA berbaju merah yang maju."

Karena memakai CSS selector, querySelector sangat fleksibel: '.card', '#main', 'ul li' semua bisa. Tapi ia hanya mengembalikan satu — yang pertama ditemukan.

qs.js
const el = document.querySelector('.card');
console.log(el.textContent); // kartu pertama
🎯 Demo: Pilih Elemen Pertama
Hanya orang pertama berbaju merah yang akan terpilih…
6
querySelectorAll()
Selektor
Mencari SEMUA elemen yang cocok. Hasilnya adalah NodeList (mirip array) yang bisa di-loop.
🎯 ANALOGI
"Seperti guru yang meminta SEMUA murid berbaju merah berdiri — semua yang cocok bereaksi sekaligus."

Untuk mengolah banyak elemen sekaligus, gunakan forEach pada hasil querySelectorAll. Sangat berguna untuk memberi gaya atau event ke banyak elemen.

qsa.js
const els = document.querySelectorAll('.red');
els.forEach((el) => {
  el.style.transform = 'scale(1.2)';
});
✨ Demo: Sorot Semua (cascade)
Semua elemen merah akan disorot berurutan…
7
innerHTML
Konten
Membaca atau mengubah isi HTML sebuah elemen — termasuk tag HTML di dalamnya.
🎯 ANALOGI
"Seperti kamu menulis ulang ISI halaman buku — kamu bisa menambah gambar, tulisan tebal, atau apapun."
<strong>Halo!</strong>|

innerHTML mem-parsing string sebagai HTML. Bagus untuk membuat struktur, tapi hati-hati jika datanya dari user — bisa menjadi celah keamanan (XSS).

inner.js
el.innerHTML = '<strong>Halo!</strong>';
⌨️ Demo: Render HTML Real-time
8
textContent
Konten
Membaca / mengubah teks biasa elemen — TANPA mem-parsing HTML. Tag akan tampil apa adanya.
🎯 ANALOGI
"Seperti menulis di papan tulis biasa — kamu tulis teks saja, tidak ada format khusus."
Input yang sama: <b>Tebal</b>
innerHTML →
Tebal
textContent →
<b>Tebal</b>

Gunakan textContent ketika kamu hanya butuh teks — lebih aman dan lebih cepat daripada innerHTML karena tidak mem-parsing HTML.

text.js
el.textContent = 'Halo Dunia!';
⚖️ Demo: innerHTML vs textContent
Lihat perbedaan keduanya di sini…
9
classList
Styling
Mengelola CSS class: .add() .remove() .toggle() .contains()
🎯 ANALOGI
"Seperti mengganti baju karakter game — setiap class = satu outfit. Toggle = pakai/lepas."

toggle adalah favorit: jika class ada → dihapus, jika tidak ada → ditambah. Sempurna untuk tombol on/off seperti menu, dark mode, atau status aktif.

classlist.js
el.classList.add('aktif');
el.classList.remove('aktif');
el.classList.toggle('outfit-keren');
👕 Demo: Ganti Outfit Karakter
Class saat ini: character
🔔

Bagian 2 — Interaksi Pengguna

Sekarang kita beri "telinga" pada halaman web. Saatnya belajar Event Listener agar web bisa merespons klik, ketikan, dan aksi pengguna lainnya.

11
Event Listener — Konsep
Event
Event = kejadian di browser: click input mouseover submit keydown
🎯 ANALOGI
"Seperti bel pintu rumahmu — browser 'mendengarkan' kejadian, dan ketika terjadi, ia menjalankan fungsi."
🔔
Klik bel di bawah →

Alur sebuah event sangat sederhana namun powerful. Klik tombol di demo untuk melihat aliran event menyala satu per satu.

🔄 Flowchart: Event Flow

👆 User Interaction (klik bel)
⚡ Event Terpicu (event 'click')
👂 Event Listener menangkap
🛠️ Handler Function dijalankan
✨ DOM diperbarui (output)
🔔 Demo: Bunyikan Bel
Aliran event akan menyala dari atas ke bawah…
12
button.addEventListener()
Event
Sintaks: elemen.addEventListener('event', fungsi) — cara utama memasang event.
🎯 ANALOGI
"Seperti memasang satpam di pintu — satpam (listener) selalu siaga, saat ada tamu (event) langsung bertindak (handler)."
💂
Satpam siaga…

Satu elemen bisa punya banyak listener untuk event berbeda. Coba tombol di bawah — setiap klik tercatat di event log.

listener.js
const btn = document.querySelector('#tombol');
let n = 0;
btn.addEventListener('click', () => {
  n++;
  console.log('Diklik ' + n + ' kali');
});
🖱️ Demo: Counter Klik + Event Log
Event log kosong…
13
Form Validation
Praktik
Memeriksa input sebelum dikirim menggunakan DOM + Event, lalu menampilkan pesan error.
🎯 ANALOGI
"Seperti petugas bandara yang memeriksa tiket sebelum kamu masuk — kalau tiket salah, ditolak."

🔄 Flowchart: Validasi

Input user → trim()
Kosong? → ❌ Error "wajib diisi"
Email valid? → ❌ Error format
Password ≥ 8? → ❌ Error pendek
✅ Semua valid → Submit!
📝 Demo: Form dengan Validasi Real-time
Isi form lalu klik submit…
14
Dynamic Content
Praktik
Membuat elemen baru lewat JS: createElement() appendChild() removeChild()
🎯 ANALOGI
"Seperti koki yang memasak hidangan baru di atas meja kosong — setiap hidangan (elemen) dibuat dan disajikan saat dibutuhkan."
👨‍🍳 → 🍽️

Langkah membuat elemen: buat (createElement) → isi (textContent/innerHTML) → tempel (appendChild) ke induknya.

dynamic.js
const li = document.createElement('li');
li.textContent = 'Item baru';
list.appendChild(li);
➕ Demo: Tambah / Hapus Item
    15
    Dark Mode Toggle
    Praktik
    Toggle Dark/Light dengan classList.toggle() pada body, disimpan di localStorage.
    🎯 ANALOGI
    "Seperti saklar lampu kamar — satu klik, suasana berubah total."
    ☀️ Mode Terang

    Dengan localStorage, pilihan mode pengguna tetap tersimpan walau halaman ditutup. Coba toggle lalu lihat penjelasannya.

    darkmode.js
    document.body.classList.toggle('dark');
    localStorage.setItem('mode', 'dark');
    🌗 Demo: Saklar Mode
    Status: Terang ☀️
    16
    Modal Popup
    Praktik
    Membuat dialog box (modal) yang muncul di atas konten dan bisa ditutup.
    🎯 ANALOGI
    "Seperti notifikasi WhatsApp yang muncul di atas layar — menutup yang ada di bawahnya sampai kamu klik."

    Modal terdiri dari overlay (latar gelap) dan box (kotak isi). Menampilkannya = tambah class show, menutupnya = hapus class itu.

    modal.js
    function buka() { overlay.classList.add('show'); }
    function tutup() { overlay.classList.remove('show'); }
    💬 Demo: Modal Penuh Fungsi
    17
    Dynamic Card
    Praktik
    Generate kartu HTML dari array data menggunakan loop — bukan ditulis manual satu per satu.
    🎯 ANALOGI
    "Seperti toko online yang menampilkan produk — setiap kartu digenerate dari data, bukan diketik manual."
    card.js
    const data = [{judul:'A'}, {judul:'B'}];
    data.forEach(d => {
      grid.innerHTML += `<div>${d.judul}</div>`;
    });
    🛒 Demo: Generate Kartu
    18
    Mini Project — To-Do List App
    Project

    Menggabungkan semua konsep DOM dalam satu aplikasi nyata: input + event, classList toggle, createElement & removeChild, dan counter dinamis.

    🏗️ Arsitektur Aplikasi

    📥 Input + Tombol "Tambah" (addEventListener)
    📋 Array tasks[] sebagai sumber data
    🔁 render() → createElement tiap task
    ✅ Toggle selesai · 🗑️ Hapus · 🔢 Counter
    💾 Simpan ke localStorage (bonus)
    ✅ Demo: To-Do List FULL
    Total: 0 · Selesai: 0
    19
    Latihan 1 — Manipulasi Elemen Dasar
    Latihan

    📋 Instruksi

    1. Buat file latihan1.html dengan sebuah <h1 id="judul">.
    2. Tambahkan 3 paragraf <p class="teks">.
    3. Gunakan getElementById untuk mengubah teks judul menjadi namamu.
    4. Gunakan querySelectorAll untuk mengubah warna semua paragraf jadi biru.
    5. Tambahkan tombol yang saat diklik menambah class aktif ke judul.
    ⏱️ Estimasi: 15–20 menit
    starter — latihan1.html
    <h1 id="judul">Judul Awal</h1>
    <p class="teks">Paragraf 1</p>
    <p class="teks">Paragraf 2</p>
    <p class="teks">Paragraf 3</p>
    <button id="btn">Aktifkan</button>
    
    <script>
      // Tulis kode-mu di sini…
    </script>

    🎯 Expected Output

    • Judul berubah menjadi nama siswa
    • Ketiga paragraf berwarna biru
    • Klik tombol → judul mendapat efek class "aktif"
    Gunakan document.getElementById('judul').textContent = 'Nama', lalu document.querySelectorAll('.teks').forEach(p => p.style.color='blue'), dan pasang btn.addEventListener('click', ...).
    20
    Latihan 2 — Event Listener & Form
    Latihan

    📋 Instruksi

    1. Buat form pendaftaran: Nama, Email, dan Nomor HP.
    2. Pasang event submit dan cegah reload dengan e.preventDefault().
    3. Validasi: Nama tidak kosong, Email mengandung @, Nomor HP minimal 10 digit angka.
    4. Tampilkan pesan error di bawah tiap field yang salah.
    5. Jika semua valid, tampilkan pesan sukses berwarna hijau.
    ⏱️ Estimasi: 20–30 menit
    Cek nomor HP dengan /^[0-9]{10,}$/.test(hp). Untuk email cukup email.includes('@') di level pemula. Kosongkan pesan error dulu setiap kali submit sebelum validasi ulang.
    starter — latihan2.html
    <form id="daftar">
      <input id="nama" placeholder="Nama">
      <input id="email" placeholder="Email">
      <input id="hp" placeholder="No HP">
      <button>Daftar</button>
    </form>
    <p id="pesan"></p>

    ✅ Kriteria Penilaian

    • Form mencegah reload saat submit
    • Setiap field divalidasi dengan benar
    • Pesan error muncul di field yang salah
    • Pesan sukses muncul jika semua benar
    21
    Tugas Akhir — To-Do List App Versi Kamu
    Tugas Akhir

    🎯 Deskripsi

    Buat aplikasi To-Do List milikmu sendiri menggunakan HTML, CSS, dan JavaScript murni (tanpa framework). Terapkan semua konsep DOM yang sudah dipelajari di bab ini.

    ✅ Fitur WAJIB

    • Tambah task (input + addEventListener)
    • Hapus task (removeChild)
    • Tandai selesai (classList.toggle)
    • Counter jumlah task & yang selesai

    ⭐ Fitur BONUS (nilai plus)

    • Edit task yang sudah ada
    • Filter: Semua / Aktif / Selesai
    • Simpan ke localStorage
    • Deadline / tanggal pada task

    📤 Pengumpulan

    • Format: 1 file index.html (CSS & JS embedded)
    • Nama file: tugas-todo-[nama].html
    • Kumpulkan via LMS sekolah
    • Deadline: 2 minggu setelah materi diberikan

    📊 Rubrik Penilaian

    AspekBobot
    Tambah & tampil task25%
    Hapus task20%
    Toggle selesai20%
    Counter berfungsi15%
    Tampilan rapi & rapih10%
    Fitur bonus+10%
    🎓

    Selamat! Kamu Menguasai DOM

    Kamu kini bisa membuat web yang hidup & interaktif. DOM adalah jembatan antara JavaScript dan halaman yang dilihat pengguna.

    ⌨️ Panduan untuk Guru

    • Pindah slide
    • Space Jalankan demo di slide aktif
    • Setiap demo bisa diklik & di-reset langsung di kelas — 100% offline.
    • Edit konten: buka file index.html, cari slide bernomor.