DOM: Seleksi Elemen
Mengambil elemen HTML dari JavaScript: getElementById, querySelector, querySelectorAll, dan kawan-kawannya. Termasuk cara menangani hasil null dan masalah script yang jalan sebelum HTML selesai dimuat.
DOM Itu Apa dan Kenapa Seleksi Itu Langkah Pertama?
DOM (Document Object Model) adalah representasi halaman HTML sebagai pohon object yang bisa dimanipulasi JavaScript. Setiap tag menjadi node: document adalah akarnya, <body> cabangnya, dan seterusnya. Sebelum kamu bisa mengubah teks, warna, atau memasang event, kamu harus dulu "menunjuk" elemen yang dimaksud. Itulah seleksi, dan ia adalah langkah pertama dari SEMUA manipulasi DOM.
Bayangkan DOM seperti denah rumah: kamu tidak bisa mengecat dinding kalau tidak tahu dinding yang mana. Method seleksi adalah caramu menunjuk "dinding ruang tamu".
Empat Cara Menyeleksi
Contoh sederhana dengan HTML playground modul ini (<h1 id="judul"> dan dua <p class="item">):
document.getElementById("judul"); // satu elemen, by id (paling cepat)
document.getElementsByClassName("item"); // koleksi semua ber-class item
document.querySelector(".item"); // SATU pertama yang cocok (sintaks CSS)
document.querySelectorAll(".item"); // SEMUA yang cocok (NodeList)querySelector adalah yang paling fleksibel karena memakai sintaks CSS yang sudah kamu kenal:
document.querySelector("#form input[name=email]"); // input email di dalam #form
document.querySelector("ul.menu > li:first-child"); // li pertama di ul.menu
document.querySelectorAll("button.hapus"); // semua tombol hapusContoh realistis: mengambil semua item lalu menampilkan teksnya bernomor.
const judul = document.getElementById("judul");
console.log("Judul halaman:", judul.textContent);
const items = document.querySelectorAll(".item");
console.log("Jumlah item:", items.length);
items.forEach((el, i) => {
console.log(`Item ${i + 1}: ${el.textContent}`);
});Kapan Pakai yang Mana?
- Butuh SATU elemen dengan id unik?
getElementById: paling cepat dan paling jelas. - Seleksi kompleks ala CSS (kombinasi class, atribut, pseudo)?
querySelector/querySelectorAll. getElementsByClassNameme-return HTMLCollection yang "hidup" (otomatis mengikuti perubahan DOM), sedangkanquerySelectorAllme-return NodeList statis. Untuk kebanyakan kasus, NodeList lebih predictable.
Elemen Bisa Bernilai null
Ini sumber error nomor satu pemula DOM:
const el = document.getElementById("tidak-ada");
console.log(el); // null
el.textContent; // TypeError! tidak bisa baca properti dari nullSelalu pastikan id/class-nya benar. Pola defensifnya:
const tombol = document.getElementById("tombol");
if (tombol) {
tombol.textContent = "Siap diklik";
} else {
console.warn("Elemen #tombol tidak ditemukan, cek HTML");
}Jebakan Umum
- Script yang dieksekusi SEBELUM HTML selesai dimuat tidak akan menemukan elemen apa pun. Solusinya: taruh
<script>tepat sebelum '</body>' (seperti semua playground di sini), tambahkan atributdefer, atau bungkus kodemu dalamdocument.addEventListener("DOMContentLoaded", ...). - Salah ketik id:
getElementById("Judul")tidak sama dengangetElementById("judul"). Id bersifat case-sensitive. querySelectorAllme-return NodeList, bukan Array. Ia punyaforEachtapi tidak punyamapataufilter. Butuh method array? Konversi dulu:[...document.querySelectorAll(".item")].
Ringkasan
Seleksi adalah gerbang semua manipulasi DOM: getElementById untuk satu elemen by id, querySelector/querySelectorAll untuk seleksi fleksibel ala CSS. Selalu waspadai hasil null dan pastikan script berjalan setelah HTML dimuat. Kuasai querySelector karena sintaksnya sama dengan CSS yang sudah kamu kenal, jadi tidak ada hal baru untuk dihafal.
export default function App(): JSX.Element { return <h1>Hello world</h1> }
Tantangan
Selektor Campuran
Di playground ini ada h1#judul dan p.item. Ambil judul dengan getElementById, ambil SEMUA .item dengan querySelectorAll, tampilkan textContent tiap item dengan forEach. Membedakan kapan memakai selektor tunggal versus jamak adalah skill dasar setiap front-end developer: hampir semua fitur interaktif diawali dengan mengambil elemen yang tepat.
<!doctype html> <html> <head> <meta charset="utf-8" /> </head> <body> <h1>Halo JS</h1> <p>Buka console preview untuk melihat output.</p> <script src="index.js"></script> </body> </html>