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
// 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 changesquerySelector 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
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.
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.