Lompat ke konten
Kembali ke modul

Browser: HTML, CSS, DOM, dan Aksesibilitas · 6/8

DOM: halamanmu sebagai object

Pohon yang dibangun browser dari HTML-mu, dan bagaimana JavaScript menjangkaunya.

Baca 28 menit

Setelah pelajaran ini kamu bisa

  • Menjelaskan apa itu DOM dan bedanya dengan kode sumber HTML-mu
  • Menemukan dan mengubah elemen dengan API modern
  • Membuat dan memasukkan elemen dengan aman
  • Menjelaskan kenapa `innerHTML` dengan data pengguna itu berbahaya

DOM — Document Object Model — adalah pohon object yang dibangun browser dari HTML-mu. File HTML-mu itu cetak biru; DOM-nya bangunannya, dan ia bisa diubah setelah dibangun.

Satu hal yang perlu dipahami sejak awal: DOM itu bukan file sumbermu. View Source menampilkan apa yang dikirim server. DevTools menampilkan DOM yang hidup, termasuk semua yang sudah diubah JavaScript sejak itu. Kalau keduanya berbeda, selisih itu biasanya jawaban atas bug-mu.

Menemukan elemen

js
// The two you need. Both take any CSS selector.
document.querySelector(".venue-card");        // the FIRST match, or null
document.querySelectorAll(".venue-card");     // ALL matches, as a NodeList

// Scope a search to part of the tree - faster and safer than searching globally.
const card = document.querySelector("#card-42");
const title = card.querySelector("h3");       // only inside that card

// A NodeList is not an array. It has forEach, but not map or filter.
const cards = document.querySelectorAll(".venue-card");
const titles = [...cards].map((c) => c.textContent);   // spread it first

// Older API you will still meet:
document.getElementById("card-42");           // marginally faster, id only
document.getElementsByClassName("card");      // LIVE - updates as the DOM changes
Coba sendiri

querySelector yang berfungsi di atas pohon object biasa. Membangun penelusurannya menunjukkan tidak ada sihir di dalamnya.

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Mengubah elemen

js
const card = document.querySelector(".card");

// Text. Always prefer textContent.
card.textContent = "New title";

// Classes - a proper API, so no string juggling.
card.classList.add("featured");
card.classList.remove("hidden");
card.classList.toggle("open");                    // add if absent, remove if present
card.classList.toggle("dark", isDarkMode);        // force a state with a boolean
card.classList.contains("featured");

// Attributes vs properties. `data-*` attributes are for your own metadata.
card.setAttribute("aria-expanded", "true");
card.dataset.venueId = "42";                      // becomes data-venue-id="42"

// Creating and inserting.
const item = document.createElement("li");
item.textContent = "Villa C";
item.className = "card";
document.querySelector(".venues").append(item);

item.remove();
classList.toggle("dark", boolean) adalah cara pengalih tema di proyek ini mengatur class-nya — satu baris, tanpa percabangan.

textContent versus innerHTML

textContent mengatur teks. innerHTML mem-parse sebuah string sebagai HTML lalu membangun elemen darinya. Perbedaan itu adalah sebuah batas keamanan.

Coba sendiri

Kenapa pilihannya penting. Ini menunjukkan payload yang dipakai serangan XSS nyata, dan apa yang dilakukan masing-masing API terhadapnya.

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Tugas praktik

Di console browser pada halaman ini, jalankan document.querySelectorAll("h2").length, lalu [...document.querySelectorAll("h2")].map(h => h.textContent). Sekarang jalankan document.body.classList.toggle("dark") dan lihat temanya berbalik — kamu baru saja melakukan apa yang dilakukan pengalih tema. Muat ulang untuk membatalkan.

Hasil yang diharapkan

Sebuah hitungan, array berisi teks heading, dan perubahan tema yang terlihat.