Site icon JocoDEV

Apa Itu DOM dan Manipulasi DOM

Belajar Pemrograman JavaScript dari Nol #4

Apa itu DOM? Bagi yang baru belajar JavaScript, istilah ini mungkin terdengar asing. Singkatnya, DOM (Document Object Model) adalah representasi struktur halaman web yang memungkinkan JavaScript berinteraksi dengan elemen HTML. Bayangkan DOM seperti peta yang memetakan setiap komponen website—mulai dari teks, gambar, hingga tombol—sehingga kita bisa memanipulasinya secara dinamis. Tanpa DOM, web akan statis dan kurang interaktif. Di artikel ini, kita akan bahas dasar-dasar DOM, cara kerjanya, dan bagaimana memanfaatkannya untuk membuat website lebih responsif. Yuk, simak selengkapnya!

Baca Juga: Apa Itu JavaScript dan Environment JavaScript

Pengertian DOM dalam JavaScript

DOM (Document Object Model) adalah representasi hierarkis dari struktur dokumen HTML yang memungkinkan JavaScript mengakses dan memanipulasi konten, struktur, dan gaya sebuah halaman web. Ketika browser memuat HTML, ia membuat pohon objek (tree-like structure) yang mencerminkan elemen-elemen seperti <div>, <p>, atau <button>. JavaScript bisa mengubah, menambah, atau menghapus elemen ini secara dinamis.

Menurut MDN Web Docs, DOM adalah antarmuka pemrograman untuk dokumen web—bukan bahasa, melainkan cara browser mengorganisir elemen agar bisa diubah dengan script.

Contoh sederhana:

// Mengambil elemen dengan ID "demo"
const element = document.getElementById("demo");
// Mengubah teks di dalamnya
element.textContent = "Halo, DOM!";

DOM bukan bagian dari JavaScript itu sendiri, melainkan standar yang diimplementasikan browser. Setiap elemen HTML menjadi “node” dalam pohon DOM, dan kita bisa menjelajahinya (misal: parentNode, childNodes).

Contoh manipulasi properti CSS:

const box = document.querySelector(".box");
box.style.backgroundColor = "blue"; // Mengubah warna latar

Tanpa DOM, web hanya berupa dokumen statis. Dengan DOM, kita bisa membuat interaksi seperti form validasi, animasi, atau pembaruan konten tanpa reload halaman.

Baca Juga: Konsep Dasar Pemrograman dan Algoritma Logika

Fungsi DOM pada Pengembangan Web

DOM (Document Object Model) adalah tulang punggung interaktivitas web. Tanpanya, website hanya akan menjadi dokumen statis tanpa respons terhadap input pengguna. Fungsi utamanya meliputi:

  1. Mengakses Elemen: JavaScript bisa “menyentuh” elemen HTML menggunakan metode seperti getElementById, querySelector, atau getElementsByClassName. Contoh:
    const button = document.querySelector("#submit-btn");
  2. Memodifikasi Konten: Mengubah teks, HTML, atau atribut secara dinamis. Misal, update nilai input:
  3. Mengubah Gaya CSS: Menyesuaikan tampilan berdasarkan interaksi. Contoh toggle class:
  4. Event Handling: Menanggapi klik, scroll, atau input pengguna. Dari MDN:
  5. Manipulasi Struktur: Menambah/menghapus elemen. Misal, membuat elemen baru:
document.getElementById("username").value = "User123";
const menu = document.querySelector(".menu");
menu.classList.toggle("active");
button.addEventListener("click", () => {
	alert("Tombol diklik!");
});
const newElement = document.createElement("div");
document.body.appendChild(newElement);

DOM juga memungkinkan AJAX (fetch data tanpa reload) dan Single Page Applications (SPA). Contoh:

fetch("data.json")
	.then(response => response.json())
	.then(data => {
		document.getElementById("content").innerHTML = data.text;
	});

Dengan DOM, web menjadi platform dinamis yang responsif terhadap pengguna.

Baca Juga: Cara Optimasi JavaScript Agar Lebih Cepat

Cara Mengakses Elemen DOM

Mengakses elemen DOM adalah langkah pertama untuk manipulasi konten web. JavaScript menyediakan beberapa metode utama:

  1. getElementById: Mengambil elemen berdasarkan ID. Cepat dan spesifik.
    const header = document.getElementById("header");
  2. querySelector & querySelectorAll: Fleksibel dengan sintaks CSS selector. querySelector mengembalikan elemen pertama yang cocok, sementara querySelectorAll mengembalikan NodeList.
  3. getElementsByClassName: Mengambil koleksi elemen dengan class tertentu.
  4. getElementsByTagName: Mengakses elemen berdasarkan tag HTML (misal: semua <li>).
  5. Traversing DOM: Navigasi relatif dari elemen yang sudah diakses. Contoh dari MDN:
const button = document.querySelector(".btn-primary");
const allImages = document.querySelectorAll("img");
const cards = document.getElementsByClassName("card");
const listItems = document.getElementsByTagName("li");
const parent = document.querySelector(".parent");
const firstChild = parent.firstElementChild;
const nextSibling = firstChild.nextElementSibling;

Perbedaan Koleksi vs NodeList:

Contoh konversi NodeList ke Array untuk menggunakan map/forEach:

const buttons = [...document.querySelectorAll(".btn")];
buttons.forEach(btn => btn.style.color = "red");

Pilih metode berdasarkan kebutuhan: kecepatan (getElementById) atau fleksibilitas (querySelector).

Baca Juga: Panduan Fullstack Nodejs dengan Integrasi Alpinejs

Manipulasi DOM dengan JavaScript

Setelah mengakses elemen DOM, kita bisa memanipulasinya untuk membuat web yang dinamis. Berikut cara umumnya:

1. Mengubah Konten

const div = document.querySelector("#content");
div.textContent = "Teks baru"; // Aman
div.innerHTML = "<strong>HTML</strong> di sini"; // Risiko XSS

2. Mengubah Atribut

Gunakan setAttribute atau properti langsung:

const link = document.querySelector("a");
link.href = "https://example.com"; // Properti
link.setAttribute("target", "_blank"); // Metode

3. Modifikasi CSS

Akses properti melalui style:

const box = document.querySelector(".box");
box.style.backgroundColor = "#f00";
box.style.padding = "10px";

4. Menambah/Menghapus Elemen

const newButton = document.createElement("button");
newButton.textContent = "Klik Saya";
document.body.appendChild(newButton);
newButton.remove(); // Hapus elemen

5. Toggle Class

Untuk animasi atau perubahan gaya:

const menu = document.querySelector(".menu");
menu.classList.add("active"); // Tambah class
menu.classList.toggle("hidden"); // Switch

Contoh Praktis:

// Ubah semua gambar menjadi grayscale
document.querySelectorAll("img").forEach(img => {
	img.style.filter = "grayscale(100%)";
});

Referensi: MDN DOM Manipulation.

Manipulasi DOM adalah inti dari web interaktif—mulai dari form dinamis hingga single-page apps.

Baca Juga: Mengenal dan Memahami Contoh Kode Alpine JS

Contoh Praktik Manipulasi DOM

Berikut beberapa contoh nyata manipulasi DOM yang sering digunakan di proyek web:

1. Toggle Dark Mode

Mengubah tema dengan menambahkan class CSS:

const toggleBtn = document.getElementById("dark-mode-toggle");
toggleBtn.addEventListener("click", () => {
	document.body.classList.toggle("dark-theme");
});

2. Dynamic Form Validation

Menampilkan pesan error real-time:

const emailInput = document.getElementById("email");
emailInput.addEventListener("input", () => {
	const errorText = document.querySelector(".error-email");
	errorText.textContent = emailInput.validity.valid ? "" : "Email tidak valid!";
});

3. Infinite Scroll

Memuat konten tambahan saat scroll (contoh sederhana):

window.addEventListener("scroll", () => {
	if (window.scrollY + window.innerHeight >= document.body.scrollHeight) {
		fetchMoreContent(); // Fungsi async untuk load data
	}
});

4. Todo List

Menambah/menghapus item dinamis:

const todoForm = document.querySelector("#todo-form");
todoForm.addEventListener("submit", (e) => {
	e.preventDefault();
	const input = document.querySelector("#todo-input");
	const list = document.querySelector("#todo-list");
	const newItem = document.createElement("li");
	newItem.textContent = input.value;
	list.appendChild(newItem);
	input.value = "";
});

5. Image Gallery Preview

Menampilkan preview gambar yang dipilih:

const fileInput = document.querySelector("#image-upload");
fileInput.addEventListener("change", (e) => {
	const preview = document.querySelector("#preview");
	preview.src = URL.createObjectURL(e.target.files[0]);
});

Referensi:

Contoh-contoh ini menunjukkan bagaimana DOM membuat web lebih interaktif dengan sedikit kode. Coba modifikasi sesuai kebutuhan!

Baca Juga: Cara Mudah Menggunakan Alpine JS untuk Web Dinamis

Perbedaan DOM dan Virtual DOM

DOM (Document Object Model)

// Contoh manipulasi DOM langsung
document.getElementById("title").textContent = "Baru"; // Langsung mempengaruhi render tree

Virtual DOM

// Pseudocode Virtual DOM (seperti React)
const oldVDOM = { type: 'div', props: { className: 'box' } };
const newVDOM = { type: 'div', props: { className: 'box active' } };
// React hanya mengupdate class "active" di DOM nyata

Perbedaan Kunci

  1. Performansi:
    • DOM: Lambat untuk update besar karena operasi langsung di browser.
    • Virtual DOM: Minimalkan operasi DOM nyata dengan diffing algoritma.
  2. Kompleksitas:
    • DOM: Manual (developer mengatur optimasi).
    • Virtual DOM: Diurus framework (React, Vue, dll).
  3. Penggunaan:
    • DOM: Cocok untuk proyek kecil tanpa banyak perubahan dinamis.
    • Virtual DOM: Ideal untuk aplikasi kompleks seperti SPAs.

Kapan Memilih?

// Contoh React: Virtual DOM bekerja di balik layar
function Component() {
	const [text, setText] = useState("Awal");
	return <h1 onClick={() => setText("Baru")}>{text}</h1>;
}

Virtual DOM bukan pengganti DOM, tapi lapisan optimasi. Pahami keduanya untuk pilih tool yang tepat!

Baca Juga: Mengenal Kasus Penggunaan Golang Secara Mendalam

Event Handling pada DOM

Event handling memungkinkan website merespons interaksi pengguna (klik, scroll, input, dll). Berikut cara kerjanya di JavaScript:

1. Metode Dasar

Gunakan addEventListener untuk menangkap event:

const button = document.querySelector("#myButton");
button.addEventListener("click", () => {
	console.log("Tombol diklik!");
});

2. Jenis Event Umum

Contoh input real-time:

document.getElementById("search").addEventListener("input", (e) => {
	console.log("Pencarian:", e.target.value);
})

3. Event Bubbling & Delegasi

Contoh delegasi (sumber: MDN):

document.querySelector("#list").addEventListener("click", (e) => {
	if (e.target.matches("li")) {
		console.log("Item list diklik:", e.target.textContent);
	}
});

4. Hentikan Event

document.querySelector("a").addEventListener("click", (e) => {
	e.preventDefault();
	console.log("Link dicek, tapi tidak navigasi.");
});

5. Event Object

Setiap event menyimpan info seperti:

Contoh koordinat klik:

document.addEventListener("click", (e) => {
	console.log(`Klik di (${e.clientX}, ${e.clientY})`);
});

Event handling adalah inti interaktivitas web—mulai dari tombol sederhana hingga aplikasi kompleks.

Baca Juga: Belajar Svelte – Framework JavaScript untuk Pemula

Tips Efisiensi Manipulasi DOM

Manipulasi DOM yang tidak optimal bisa memperlambat performa web. Berikut cara meminimalkan dampaknya:

1. Batasi Akses DOM

Setiap akses DOM (seperti getElementById) memerlukan traversal pohon. Cache elemen yang sering digunakan:

// Buruk: Akses DOM berulang
for (let i = 0; i < 100; i++) {
	document.getElementById("item").style.color = "red";
}
// Baik: Cache elemen
const item = document.getElementById("item");
for (let i = 0; i < 100; i++) {
	item.style.color = "red";
}

2. Gunakan DocumentFragment untuk Operasi Massal

Memasukkan banyak elemen sekaligus mengurangi reflow. Contoh dari MDN:

const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
	const div = document.createElement("div");
	fragment.appendChild(div);
}
document.body.appendChild(fragment); // Hanya 1 reflow!

3. Hindari innerHTML untuk Update Kecil

innerHTML mem-parsing ulang seluruh konten. Gunakan textContent atau manipulasi elemen langsung:

// Buruk
div.innerHTML = "<span>" + newText + "</span>";
// Baik
const span = document.createElement("span");
span.textContent = newText;
div.replaceChildren(span);

4. Debounce Event yang Sering Terjadi

Untuk event seperti resize atau scroll, gunakan debounce untuk mengurangi eksekusi:

let timeout;
window.addEventListener("resize", () => {
	clearTimeout(timeout);
	timeout = setTimeout(() => {
		console.log("Resize selesai");
	}, 200);
});

5. Manfaatkan requestAnimationFrame untuk Animasi

Lebih efisien daripada setTimeout/setInterval:

const animate = () => {
	element.style.left = (parseInt(element.style.left) + 1) + "px";
	requestAnimationFrame(animate);
};
animate();

6. Hapus Event Listener yang Tidak Dipakai

Mencegah memory leak dengan removeEventListener:

const handler = () => console.log("Klik");
button.addEventListener("click", handler);
// Saat tidak perlu:
button.removeEventListener("click", handler);

Optimasi DOM kritis untuk aplikasi cepat—terutama di perangkat rendah-spec.

Baca Juga: SSL TLS Penting Untuk Keamanan Transaksi Online

Tools untuk Debugging DOM

Debugging DOM lebih mudah dengan alat modern. Berikut tools yang sering digunakan developer:

1. Chrome DevTools

Built-in di browser Chrome (docs). Fitur utama:

$0.style.backgroundColor = "yellow"; // Debug cepat

2. Breakpoints pada Perubahan DOM

Langsung pause JavaScript saat elemen dimodifikasi:

  1. Klik kanan elemen di Elements PanelBreak onSubtree modifications.

3. React DevTools & Vue DevTools

Khusus framework seperti React/Vue:

4. Performance Monitor

Pantau dampak manipulasi DOM terhadap performa:

5. console.dir()

Tampilkan properti lengkap elemen sebagai objek:

const el = document.getElementById("app");
console.dir(el); // Lihat methods/properti

6. Library External

const { JSDOM } = require("jsdom");
const dom = new JSDOM(`<div id="root"></div>`);
console.log(dom.window.document.getElementById("root"));

Contoh Debugging Praktis:

// Cek ukuran elemen yang tidak terlihat
const hiddenEl = document.querySelector(".hidden");
console.log(hiddenEl.offsetHeight); // 0? Cek CSS `display`/`visibility`

Gunakan kombinasi tools ini untuk identifikasi masalah seperti memory leak, reflow berlebihan, atau selektor yang salah.

Baca Juga: Cara Mudah Memahami Penggunaan x-show di Alpine JS

Studi Kasus Penggunaan DOM

Berikut contoh nyata bagaimana DOM dimanfaatkan di aplikasi modern:

1. Live Search Filter

Saring daftar konten tanpa reload, seperti pencarian produk:

const searchInput = document.getElementById("search");
searchInput.addEventListener("input", () => {
	const query = searchInput.value.toLowerCase();
	document.querySelectorAll(".item").forEach(item => {
		const text = item.textContent.toLowerCase();
		item.style.display = text.includes(query) ? "block" : "none";
	});
});

2. Drag & Drop UI

Membuat antarmuka drag-and-drop dengan API DOM (MDN Reference):

const draggable = document.querySelector(".draggable");
draggable.addEventListener("dragstart", (e) => {
	e.dataTransfer.setData("text/plain", e.target.id);
});
document.querySelector(".dropzone").addEventListener("drop", (e) => {
	e.preventDefault();
	const id = e.dataTransfer.getData("text/plain");
	e.target.appendChild(document.getElementById(id));
});

3. Single Page Application (SPA) Routing

Update konten halaman tanpa reload menggunakan history.pushState:

document.querySelectorAll(".nav-link").forEach(link => {
	link.addEventListener("click", (e) => {
		e.preventDefault();
		history.pushState({}, "", e.target.href);
		document.getElementById("content").innerHTML = loadPage(e.target.dataset.page);
	});
});	

4. Real-Time Form Validation

Validasi input saat pengguna mengetik:

document.getElementById("password").addEventListener("input", (e) => {
	const feedback = document.getElementById("password-feedback");
	feedback.textContent = e.target.value.length < 8 ?
		"Password terlalu pendek" : "";
});

5. Interactive Data Visualization

Update chart SVG/Canvas berdasarkan data dinamis:

const updateChart = (data) => {
	document.querySelectorAll(".chart-bar").forEach((bar, i) => {
		bar.style.height = `${data[i] * 10}px`;
	});
};

Contoh Ekstrem: Game Browser Sederhana

const player = document.getElementById("player");
document.addEventListener("keydown", (e) => {
	const left = parseInt(player.style.left || 0);
	player.style.left = `${left + (e.key === "ArrowRight" ? 10 : -10)}px`;
});

DOM adalah tulang punggung web interaktif—dari fitur sederhana hingga kompleks seperti aplikasi Figma atau Google Docs.

Photo by Jaffer Nizami on Unsplash

Manipulasi DOM adalah kunci membuat web yang dinamis dan interaktif. Dari mengubah teks sederhana hingga membangun aplikasi single-page, penguasaan DOM memungkinkan developer menciptakan pengalaman pengguna yang responsif. Tools modern seperti querySelector, addEventListener, dan Virtual DOM membantu optimasi performa. Tantangannya adalah memilih teknik yang tepat—mulai dari akses elemen efisien hingga event handling yang cerdas. Dengan praktik dan pemahaman mendalam, DOM bukan lagi hal menakutkan, melainkan senjata ampuh untuk membangun web modern.

Exit mobile version