2704 kata
14 menit

DOM dan Event JavaScript: Membuat HTML Bisa Berinteraksi

Halo, Gabuters!

Pada artikel sebelumnya, kita sudah belajar array dan object JavaScript. Kita juga mencoba mengolah daftar artikel menggunakan forEach(), map(), dan filter().

Namun, ada satu hal yang mungkin mulai terasa.

Hampir semua contoh JavaScript kita masih menampilkan hasil menggunakan console.log().

Padahal, ketika membuka website, pengunjung tidak datang untuk melihat Console di Developer Tools.

Mereka ingin berinteraksi langsung dengan halaman.

Misalnya:

  • Menekan tombol untuk menampilkan informasi.
  • Mengubah tema website menjadi gelap.
  • Mengisi formulir dan mendapatkan pesan.
  • Melihat daftar artikel yang berubah berdasarkan pilihan kategori.

Bagaimana JavaScript bisa melakukan semua itu?

Jawabannya berkaitan dengan dua konsep penting: DOM dan event.

Pada artikel ini, kita akan belajar menghubungkan JavaScript dengan elemen HTML, mengubah isi halaman, dan merespons tindakan pengguna.

1. Apa Itu DOM?#

DOM merupakan singkatan dari Document Object Model.

Secara sederhana, DOM adalah representasi dokumen HTML dalam bentuk struktur object yang dapat diakses dan dimanipulasi oleh JavaScript.

Ketika browser membaca dokumen HTML, browser membangun representasi DOM dari dokumen tersebut.

Misalnya, kita mempunyai HTML berikut:

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Belajar DOM</title>
</head>
<body>
<h1>Halo, Gabuters!</h1>
<p>Selamat datang di BapakGabut.</p>
</body>
</html>

Secara sederhana, strukturnya bisa dibayangkan seperti ini:

document
└── html
├── head
│ ├── meta
│ └── title
└── body
├── h1
└── p

Struktur tersebut memungkinkan JavaScript menemukan elemen seperti h1, p, atau button, kemudian melakukan perubahan terhadapnya.

Jadi, HTML menyediakan struktur halaman, CSS mengatur tampilannya, sedangkan JavaScript dapat mengubah isi dan perilakunya melalui DOM.

2. Menyiapkan File HTML dan JavaScript#

Sebelum mulai praktik, kita buat dua file dalam satu folder:

belajar-dom/
├── index.html
└── script.js

Isi index.html:

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Belajar DOM JavaScript</title>
<script src="script.js" defer></script>
</head>
<body>
<h1 id="judul">Halo, Gabuters!</h1>
<p id="deskripsi">Kita sedang belajar DOM.</p>
</body>
</html>

Isi script.js:

console.log("JavaScript berhasil terhubung!");

Sekarang buka index.html menggunakan browser.

Kemudian buka Developer Tools dan pilih tab Console.

Jika semuanya benar, akan muncul:

JavaScript berhasil terhubung!

Perhatikan bagian berikut pada HTML:

<script src="script.js" defer></script>

Atribut src menunjukkan file JavaScript yang ingin digunakan.

Sedangkan defer membuat browser mengunduh script tanpa menghalangi parsing HTML dan menjalankannya setelah dokumen selesai diparsing.

Dengan begitu, elemen HTML sudah tersedia ketika kode dalam script.js mulai dijalankan.

Untuk script klasik seperti contoh ini, defer merupakan salah satu cara praktis menghindari masalah ketika JavaScript mencoba mengakses elemen yang belum dibuat.

3. Memilih Elemen dengan getElementById()#

Sekarang kita mulai mengakses HTML menggunakan JavaScript.

Pada file index.html, kita mempunyai:

<h1 id="judul">Halo, Gabuters!</h1>

Kita bisa memilih elemen tersebut berdasarkan id.

Isi script.js:

const judul = document.getElementById("judul");
console.log(judul);

Jika elemen ditemukan, Console akan menampilkan representasi elemen h1.

Perhatikan:

document.getElementById("judul")

document merupakan object yang mewakili dokumen HTML.

Method getElementById() digunakan untuk mencari elemen berdasarkan nilai atribut id.

Kita tidak perlu menuliskan tanda # ketika menggunakan getElementById().

Jika tidak ada elemen dengan id tersebut, hasilnya adalah null.

Contohnya:

const elemenTidakAda = document.getElementById("tidak-ada");
console.log(elemenTidakAda);

Hasilnya:

null

Karena itu, pastikan id yang digunakan sesuai dengan HTML.

4. Memilih Elemen dengan querySelector()#

Selain getElementById(), JavaScript menyediakan querySelector().

Method ini menggunakan sintaks CSS selector.

Contohnya:

const judul = document.querySelector("#judul");

Tanda # menunjukkan selector berdasarkan id, sama seperti dalam CSS.

Kita juga bisa memilih berdasarkan nama tag.

const paragraf = document.querySelector("p");

Atau berdasarkan class.

Misalnya, HTML kita mempunyai:

<p class="informasi">Belajar JavaScript itu menyenangkan.</p>

Kita bisa memilihnya menggunakan:

const informasi = document.querySelector(".informasi");

Perhatikan perbedaannya:

SelectorContohKeterangan
ID#judulMemilih berdasarkan ID
Class.informasiMemilih berdasarkan class
TagpMemilih berdasarkan nama elemen

querySelector() mengembalikan elemen pertama yang cocok dengan selector.

Jika tidak ada elemen yang cocok, hasilnya null.

5. Memilih Banyak Elemen dengan querySelectorAll()#

Bagaimana jika kita ingin mengambil beberapa elemen sekaligus?

Misalnya:

<ul>
<li class="kategori">HTML</li>
<li class="kategori">CSS</li>
<li class="kategori">JavaScript</li>
</ul>

Gunakan querySelectorAll().

const daftarKategori = document.querySelectorAll(".kategori");
console.log(daftarKategori);

Method tersebut menghasilkan NodeList statis berisi elemen-elemen yang cocok pada saat pemanggilan.

Kita bisa mengulanginya menggunakan forEach().

daftarKategori.forEach((kategori) => {
console.log(kategori.textContent);
});

Hasilnya:

HTML
CSS
JavaScript

Ini salah satu contoh bagaimana materi array, function, dan perulangan mulai digunakan untuk mengolah elemen halaman.

Perlu diperhatikan bahwa NodeList bukan array biasa, walaupun memiliki beberapa kemampuan yang mirip, seperti forEach().

6. Mengubah Teks dengan textContent#

Sekarang kita coba mengubah isi halaman.

Gunakan HTML berikut:

<h1 id="judul">Halo, Gabuters!</h1>

Lalu JavaScript:

const judul = document.getElementById("judul");
judul.textContent = "Selamat Datang di BapakGabut!";

Ketika halaman dibuka, teks pada elemen h1 berubah menjadi:

Selamat Datang di BapakGabut!

Kita tidak perlu mengubah isi HTML secara manual.

JavaScript dapat melakukannya setelah halaman dimuat.

Menggunakan nilai dari variabel#

const namaWebsite = "BapakGabut";
const judul = document.getElementById("judul");
judul.textContent = `Selamat Datang di ${namaWebsite}!`;

Hasilnya sama.

textContent dan innerHTML#

Selain textContent, ada properti innerHTML.

Contohnya:

const deskripsi = document.getElementById("deskripsi");
deskripsi.innerHTML = "<strong>Belajar DOM JavaScript</strong>";

Kode tersebut membuat teks menjadi tebal karena string diproses sebagai markup HTML.

Namun, kita harus berhati-hati.

Jangan memasukkan teks yang berasal dari pengguna atau sumber tidak tepercaya secara langsung ke innerHTML.

Hal tersebut dapat membuka risiko Cross-Site Scripting (XSS).

Jika tujuannya hanya menampilkan teks, gunakan textContent.

deskripsi.textContent = "<strong>Belajar DOM JavaScript</strong>";

Pada contoh ini, tag HTML akan ditampilkan sebagai teks biasa, bukan diproses menjadi elemen HTML.

Untuk membuat elemen HTML secara dinamis, kita juga bisa menggunakan method DOM seperti createElement() yang akan dibahas nanti.

7. Mengenal Event JavaScript#

Sampai sekarang, perubahan halaman terjadi langsung ketika script dijalankan.

Tetapi bagaimana jika kita ingin perubahan terjadi setelah pengguna menekan tombol?

Kita membutuhkan event.

Event adalah kejadian yang dapat dideteksi dan ditangani oleh JavaScript.

Contohnya:

  • click: ketika elemen diklik.
  • input: ketika nilai input berubah karena interaksi pengguna.
  • change: ketika perubahan nilai pada elemen tertentu dikonfirmasi.
  • submit: ketika formulir dikirim.
  • keydown: ketika tombol keyboard ditekan.

JavaScript dapat menjalankan function sebagai respons terhadap event tersebut.

8. Menangani Klik dengan addEventListener()#

Sekarang kita buat tombol yang mengubah teks.

Isi index.html:

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Belajar Event JavaScript</title>
<script src="script.js" defer></script>
</head>
<body>
<h1 id="judul">Halo, Gabuters!</h1>
<button id="tombol" type="button">
Ubah Judul
</button>
</body>
</html>

Isi script.js:

const judul = document.getElementById("judul");
const tombol = document.getElementById("tombol");
tombol.addEventListener("click", () => {
judul.textContent = "Judul berhasil diubah!";
});

Sekarang buka halaman dan klik tombol Ubah Judul.

Teks pada h1 akan berubah.

Mari kita pahami bagian ini:

tombol.addEventListener("click", () => {
judul.textContent = "Judul berhasil diubah!";
});

addEventListener() digunakan untuk mendaftarkan function yang akan dijalankan ketika event tertentu terjadi.

Argument pertama adalah jenis event, yaitu "click".

Argument kedua adalah callback function yang dijalankan saat event tersebut terjadi.

Dalam contoh ini, kita menggunakan arrow function.

Menggunakan function terpisah#

Kita juga bisa menuliskannya seperti ini:

function ubahJudul() {
judul.textContent = "Judul berhasil diubah!";
}
tombol.addEventListener("click", ubahJudul);

Perhatikan bahwa kita menulis:

ubahJudul

Bukan:

ubahJudul()

Karena kita ingin memberikan function kepada addEventListener(), bukan langsung menjalankannya saat kode tersebut dibaca.

9. Membaca Input Pengguna#

Sekarang kita coba membuat halaman yang menerima nama pengunjung.

Isi index.html:

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Input JavaScript</title>
<script src="script.js" defer></script>
</head>
<body>
<h1>Form Sambutan</h1>
<label for="nama">Nama pengunjung:</label>
<input id="nama" type="text">
<button id="sapa" type="button">
Tampilkan Salam
</button>
<p id="hasil"></p>
</body>
</html>

Isi script.js:

const inputNama = document.getElementById("nama");
const tombolSapa = document.getElementById("sapa");
const hasil = document.getElementById("hasil");
tombolSapa.addEventListener("click", () => {
const nama = inputNama.value;
hasil.textContent = `Halo, ${nama}!`;
});

Sekarang coba isi nama pada kolom input, kemudian klik tombol.

Pesan sambutan akan muncul di bawahnya.

Apa itu value?#

Properti value digunakan untuk membaca nilai yang dimasukkan pada elemen formulir tertentu, termasuk input teks.

Contohnya:

const nama = inputNama.value;

Hasil pembacaan input teks berupa string.

Jika kita ingin mengolah input angka, kita perlu melakukan konversi dan validasi.

Konsep ini sudah kita pelajari pada artikel tipe data JavaScript.

10. Melakukan Validasi Input Sederhana#

Sekarang kita tambahkan validasi.

Kita tidak ingin menampilkan:

Halo, !

Ketika pengguna belum mengisi nama.

Ubah script.js menjadi:

const inputNama = document.getElementById("nama");
const tombolSapa = document.getElementById("sapa");
const hasil = document.getElementById("hasil");
tombolSapa.addEventListener("click", () => {
const nama = inputNama.value.trim();
if (nama === "") {
hasil.textContent = "Nama tidak boleh kosong.";
return;
}
hasil.textContent = `Halo, ${nama}! Selamat datang di BapakGabut.`;
});

Sekarang jika input kosong, program akan menampilkan:

Nama tidak boleh kosong.

Method trim() digunakan untuk menghapus whitespace di awal dan akhir string.

Contohnya:

console.log(" Gabuters ".trim());

Hasilnya:

Gabuters

Dengan trim(), input yang hanya berisi spasi juga dianggap kosong.

Perhatikan penggunaan return di dalam callback.

Ketika input kosong, callback berhenti setelah menampilkan pesan validasi.

Jadi, pesan sambutan tidak akan dijalankan.

Ini contoh penggunaan function, percabangan, dan DOM secara bersamaan.

Perlu diingat bahwa validasi di browser membantu pengalaman pengguna, tetapi bukan pengganti validasi di server ketika data dikirim ke backend.

11. Menggunakan Event input#

Pada contoh sebelumnya, pengguna harus menekan tombol untuk menampilkan hasil.

Sekarang kita coba membuat teks berubah langsung ketika pengguna mengetik.

Isi HTML:

<label for="nama">Nama:</label>
<input id="nama" type="text">
<p id="pratinjau">Halo, Gabuters!</p>

Isi JavaScript:

const inputNama = document.getElementById("nama");
const pratinjau = document.getElementById("pratinjau");
inputNama.addEventListener("input", () => {
const nama = inputNama.value.trim();
if (nama === "") {
pratinjau.textContent = "Halo, Gabuters!";
return;
}
pratinjau.textContent = `Halo, ${nama}!`;
});

Sekarang teks pada paragraf akan berubah ketika pengguna mengetik.

Event input sering digunakan untuk fitur seperti:

  • Pratinjau teks.
  • Penghitung jumlah karakter.
  • Validasi input saat mengetik.
  • Pencarian interaktif.

Kita akan menggunakan konsep ini lagi ketika membuat mini project JavaScript.

12. Mengubah Tampilan dengan classList#

JavaScript juga dapat mengubah class pada elemen HTML.

Ini berguna karena kita tidak perlu menuliskan semua pengaturan tampilan melalui JavaScript.

Kita bisa menyerahkan urusan desain kepada CSS.

Contohnya, kita ingin membuat tombol yang mengubah warna sebuah kotak.

Isi index.html:

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Belajar classList</title>
<style>
.kotak {
padding: 20px;
background-color: #eeeeee;
color: #222222;
border-radius: 8px;
}
.aktif {
background-color: #2563eb;
color: #ffffff;
}
</style>
<script src="script.js" defer></script>
</head>
<body>
<div id="kotak" class="kotak">
Kotak informasi BapakGabut
</div>
<button id="ubahWarna" type="button">
Ubah Warna
</button>
</body>
</html>

Isi script.js:

const kotak = document.getElementById("kotak");
const tombol = document.getElementById("ubahWarna");
tombol.addEventListener("click", () => {
kotak.classList.toggle("aktif");
});

Ketika tombol diklik, class aktif akan ditambahkan jika belum ada.

Jika class tersebut sudah ada, toggle() akan menghapusnya.

Dengan demikian, warna kotak berubah setiap kali tombol diklik.

Method classList lainnya#

Selain toggle(), ada beberapa method yang sering digunakan.

kotak.classList.add("aktif");

Menambahkan class.

kotak.classList.remove("aktif");

Menghapus class.

kotak.classList.contains("aktif");

Memeriksa apakah elemen memiliki class tersebut. Hasilnya berupa boolean.

Pola mengubah class melalui JavaScript sangat berguna untuk membuat tema gelap, menu yang bisa dibuka dan ditutup, serta berbagai efek interaktif.

13. Mengenal Event Object#

Ketika event terjadi, browser menyediakan sebuah event object kepada listener.

Object tersebut berisi informasi tentang kejadian yang sedang ditangani.

Contohnya:

const tombol = document.getElementById("tombol");
tombol.addEventListener("click", (event) => {
console.log(event.type);
});

Ketika tombol diklik, hasilnya:

click

Kita juga bisa mengakses elemen yang menjadi target event.

tombol.addEventListener("click", (event) => {
console.log(event.target);
});

Pada contoh sederhana ini, target biasanya adalah tombol yang diklik.

Namun, jika sebuah elemen mempunyai elemen anak, event.target dapat merujuk pada elemen anak tersebut.

Sementara itu, event.currentTarget merujuk pada elemen tempat listener sedang dijalankan.

Perbedaan ini akan lebih terasa ketika kita mempelajari event bubbling dan event delegation pada aplikasi yang lebih kompleks.

Untuk sekarang, cukup pahami bahwa event object menyediakan informasi tambahan tentang interaksi pengguna.

14. Menangani Form dengan submit#

Sekarang kita coba menggunakan elemen <form>.

Berbeda dengan contoh tombol biasa, formulir memiliki event submit.

Contoh HTML:

<form id="formNama">
<label for="nama">Nama:</label>
<input id="nama" type="text">
<button type="submit">Kirim</button>
</form>
<p id="hasil"></p>

JavaScript:

const form = document.getElementById("formNama");
const inputNama = document.getElementById("nama");
const hasil = document.getElementById("hasil");
form.addEventListener("submit", (event) => {
event.preventDefault();
const nama = inputNama.value.trim();
if (nama === "") {
hasil.textContent = "Silakan isi nama terlebih dahulu.";
return;
}
hasil.textContent = `Terima kasih, ${nama}!`;
});

Apa fungsi preventDefault()?#

Secara default, pengiriman formulir dapat menyebabkan browser melakukan navigasi atau mengirim data sesuai konfigurasi form.

Dalam latihan ini, kita tidak ingin halaman berpindah atau dimuat ulang.

Karena itu, kita menggunakan:

event.preventDefault();

Method tersebut membatalkan tindakan default dari event yang dapat dibatalkan.

Dengan begitu, kita bisa menangani proses formulir menggunakan JavaScript.

Namun, preventDefault() tidak otomatis mengirim data ke server.

Untuk mengirim data ke backend, kita membutuhkan mekanisme tambahan seperti Fetch API, yang akan dipelajari pada seri Backend/API.

15. Membuat Elemen Baru dengan createElement()#

Sejauh ini, kita hanya mengubah elemen HTML yang sudah tersedia.

Tetapi JavaScript juga bisa membuat elemen baru.

Contohnya, kita ingin menambahkan kategori ke dalam daftar.

HTML:

<ul id="daftarKategori"></ul>

JavaScript:

const daftarKategori = document.getElementById("daftarKategori");
const itemBaru = document.createElement("li");
itemBaru.textContent = "JavaScript";
daftarKategori.appendChild(itemBaru);

Hasilnya, halaman memiliki elemen:

<ul id="daftarKategori">
<li>JavaScript</li>
</ul>

Method createElement() membuat elemen baru.

textContent mengisi teksnya.

appendChild() menambahkan elemen tersebut sebagai anak dari elemen lain.

Membuat daftar dari array#

Sekarang kita gabungkan dengan materi array.

HTML:

<ul id="daftarKategori"></ul>

JavaScript:

const kategori = ["HTML", "CSS", "JavaScript"];
const daftarKategori = document.getElementById("daftarKategori");
kategori.forEach((namaKategori) => {
const item = document.createElement("li");
item.textContent = namaKategori;
daftarKategori.appendChild(item);
});

Hasilnya, halaman menampilkan daftar:

HTML
CSS
JavaScript

Dengan pendekatan ini, kita dapat membuat tampilan berdasarkan data.

Ini merupakan fondasi penting untuk membangun aplikasi web interaktif.

16. Praktik: Filter Artikel Berdasarkan Kategori#

Sekarang kita buat contoh yang lebih lengkap.

Kita ingin menampilkan daftar artikel BapakGabut, kemudian menyediakan pilihan kategori.

Ketika pengguna memilih kategori tertentu, daftar artikel yang tampil akan berubah.

Langkah 1: Siapkan HTML#

Buat index.html:

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Filter Artikel BapakGabut</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 700px;
margin: 40px auto;
padding: 0 16px;
line-height: 1.6;
}
label {
display: block;
margin-bottom: 8px;
}
select {
padding: 8px;
margin-bottom: 20px;
}
li {
margin-bottom: 8px;
}
</style>
<script src="script.js" defer></script>
</head>
<body>
<h1>Daftar Artikel BapakGabut</h1>
<label for="filterKategori">Pilih kategori:</label>
<select id="filterKategori">
<option value="semua">Semua Kategori</option>
<option value="HTML">HTML</option>
<option value="CSS">CSS</option>
<option value="JavaScript">JavaScript</option>
</select>
<p id="jumlahArtikel"></p>
<ul id="daftarArtikel"></ul>
</body>
</html>

Langkah 2: Siapkan data artikel#

Buat script.js:

const artikel = [
{
judul: "Mengenal HTML",
kategori: "HTML"
},
{
judul: "Membuat Struktur Halaman HTML",
kategori: "HTML"
},
{
judul: "Mengenal CSS",
kategori: "CSS"
},
{
judul: "Belajar Flexbox",
kategori: "CSS"
},
{
judul: "Mengenal JavaScript",
kategori: "JavaScript"
}
];

Data ini merupakan contoh latihan, bukan daftar artikel aktual yang diambil dari website.

Langkah 3: Ambil elemen HTML#

Tambahkan di bawah data artikel:

const filterKategori = document.getElementById("filterKategori");
const daftarArtikel = document.getElementById("daftarArtikel");
const jumlahArtikel = document.getElementById("jumlahArtikel");

Langkah 4: Buat function untuk menampilkan artikel#

function tampilkanArtikel(dataArtikel) {
daftarArtikel.replaceChildren();
jumlahArtikel.textContent =
`Ditemukan ${dataArtikel.length} artikel.`;
dataArtikel.forEach((item) => {
const elemenArtikel = document.createElement("li");
elemenArtikel.textContent =
`${item.judul} — ${item.kategori}`;
daftarArtikel.appendChild(elemenArtikel);
});
}

Perhatikan:

daftarArtikel.replaceChildren();

Method tersebut menghapus seluruh elemen anak dari daftar sehingga kita tidak menambahkan hasil baru di bawah hasil lama.

Kemudian, forEach() digunakan untuk membuat elemen li bagi setiap artikel.

Langkah 5: Tambahkan event change#

filterKategori.addEventListener("change", () => {
const kategoriDipilih = filterKategori.value;
if (kategoriDipilih === "semua") {
tampilkanArtikel(artikel);
return;
}
const hasilFilter = artikel.filter((item) => {
return item.kategori === kategoriDipilih;
});
tampilkanArtikel(hasilFilter);
});

Ketika pilihan kategori berubah, event change dijalankan.

Jika pengguna memilih "semua", seluruh artikel ditampilkan.

Jika memilih kategori tertentu, filter() mengambil artikel yang sesuai.

Langkah 6: Tampilkan artikel saat halaman dibuka#

Tambahkan baris berikut pada bagian paling bawah script.js:

tampilkanArtikel(artikel);

Dengan begitu, seluruh artikel langsung muncul ketika halaman dibuka.

Kode JavaScript lengkap#

Agar lebih mudah diperiksa, berikut isi lengkap script.js:

const artikel = [
{ judul: "Mengenal HTML", kategori: "HTML" },
{ judul: "Membuat Struktur Halaman HTML", kategori: "HTML" },
{ judul: "Mengenal CSS", kategori: "CSS" },
{ judul: "Belajar Flexbox", kategori: "CSS" },
{ judul: "Mengenal JavaScript", kategori: "JavaScript" }
];
const filterKategori = document.getElementById("filterKategori");
const daftarArtikel = document.getElementById("daftarArtikel");
const jumlahArtikel = document.getElementById("jumlahArtikel");
function tampilkanArtikel(dataArtikel) {
daftarArtikel.replaceChildren();
jumlahArtikel.textContent =
`Ditemukan ${dataArtikel.length} artikel.`;
dataArtikel.forEach((item) => {
const elemenArtikel = document.createElement("li");
elemenArtikel.textContent =
`${item.judul} — ${item.kategori}`;
daftarArtikel.appendChild(elemenArtikel);
});
}
filterKategori.addEventListener("change", () => {
const kategoriDipilih = filterKategori.value;
if (kategoriDipilih === "semua") {
tampilkanArtikel(artikel);
return;
}
const hasilFilter = artikel.filter((item) => {
return item.kategori === kategoriDipilih;
});
tampilkanArtikel(hasilFilter);
});
tampilkanArtikel(artikel);

Hasil yang diharapkan#

Ketika halaman pertama kali dibuka, seluruh lima artikel ditampilkan.

Jika memilih kategori CSS, hanya dua artikel CSS yang muncul.

Jika memilih kategori JavaScript, hanya satu artikel JavaScript yang muncul.

Jika kembali memilih Semua Kategori, seluruh artikel ditampilkan lagi.

Dalam satu latihan ini, kita sudah menggabungkan:

  • Array dan object untuk menyimpan data.
  • Function untuk memisahkan logika.
  • filter() untuk memilih artikel.
  • DOM untuk membuat elemen HTML.
  • Event untuk merespons pilihan pengguna.

Inilah salah satu contoh dasar bagaimana website interaktif bekerja.

17. Kesalahan Umum Saat Menggunakan DOM dan Event#

Salah menuliskan selector#

Misalnya, HTML mempunyai:

<h1 id="judul">Halo!</h1>

Tetapi JavaScript menggunakan:

document.querySelector(".judul");

Hasilnya null karena .judul mencari class, bukan ID.

Untuk memilih ID, gunakan:

document.querySelector("#judul");

Menjalankan JavaScript sebelum elemen tersedia#

Jika script dijalankan sebelum browser membuat elemen yang ingin dipilih, hasil pencariannya bisa null.

Salah satu solusi untuk script klasik eksternal adalah menggunakan atribut defer.

Lupa bahwa input.value adalah string#

const nilai = inputAngka.value;

Walaupun pengguna mengetik angka, value dari input tetap berupa string.

Lakukan konversi dan validasi jika membutuhkan angka.

Menggunakan innerHTML untuk input pengguna#

Hindari memasukkan data tidak tepercaya secara langsung ke innerHTML.

Untuk menampilkan teks biasa, gunakan textContent.

Perhatikan:

tombol.addEventListener("click", ubahJudul());

Kode tersebut memanggil ubahJudul() saat pendaftaran listener, lalu menggunakan nilai hasil pemanggilan sebagai argument kedua.

Jika ingin menjalankan function ketika tombol diklik, gunakan:

tombol.addEventListener("click", ubahJudul);

Atau:

tombol.addEventListener("click", () => {
ubahJudul();
});

Menganggap validasi frontend sudah cukup#

Validasi JavaScript di browser berguna untuk pengalaman pengguna.

Namun, jika data akan disimpan ke database atau dikirim ke server, backend tetap perlu melakukan validasi karena kode dan permintaan dari browser tidak boleh dianggap selalu tepercaya.

18. Latihan Mandiri#

Sekarang giliran Gabuters mencoba.

Latihan 1: Tombol pengubah teks#

Buat sebuah halaman yang memiliki:

  • Satu paragraf.
  • Satu tombol.

Ketika tombol diklik, teks paragraf berubah menjadi:

Saya sedang belajar JavaScript DOM!

Latihan 2: Penghitung klik#

Buat tombol yang menampilkan jumlah klik.

Contoh:

Tombol sudah diklik 3 kali.

Gunakan variabel untuk menyimpan jumlah klik dan event click untuk menambahkannya.

Latihan 3: Pratinjau nama#

Buat input nama dan sebuah paragraf.

Ketika pengguna mengetik, tampilkan:

Halo, [nama pengguna]!

Gunakan event input dan textContent.

Latihan 4: Menambahkan daftar#

Buat sebuah input teks, tombol, dan elemen ul.

Ketika tombol diklik, tambahkan isi input sebagai elemen li baru.

Gunakan:

document.createElement("li");

Dan:

appendChild();

Pastikan input kosong tidak menghasilkan item baru.

Tantangan tambahan#

Kembangkan contoh filter artikel sebelumnya.

Tambahkan satu kategori baru, misalnya "Backend".

Kemudian tambahkan beberapa data artikel Backend ke dalam array.

Pastikan filter kategori baru tersebut dapat menampilkan artikel yang sesuai.

19. Penutup#

Pada artikel ini, kita sudah belajar bagaimana JavaScript berinteraksi dengan halaman HTML melalui DOM.

Kita mengenal getElementById(), querySelector(), dan querySelectorAll() untuk memilih elemen.

Kita juga belajar mengubah teks menggunakan textContent, mengatur class dengan classList, serta membuat elemen baru menggunakan createElement().

Kemudian, kita menggunakan addEventListener() untuk menangani event seperti click, input, change, dan submit.

Yang paling penting, kita sudah membuat contoh halaman yang benar-benar interaktif menggunakan kombinasi HTML, CSS, dan JavaScript.

Sekarang kita mempunyai bekal untuk mengembangkan mini project yang lebih lengkap.

Pada artikel berikutnya, kita akan membuat Mini Project JavaScript: Membuat Halaman Profil Interaktif.

Kita akan melanjutkan halaman profil dari seri HTML dan CSS, kemudian menambahkan interaksi seperti tombol tema gelap, pesan sambutan, dan validasi formulir sederhana.

Sampai jumpa di mini project berikutnya, Gabuters!

JavaScript

Selesai

Bagian 7 dari 8Tulisan ini bagian dari seri

Bagikan Artikel

Buat poster berbagi atau salin tautan artikel ini.

Lanjut membaca

Bacaan terkait

Berdasarkan tag dan kategori yang sama

Coba jalur lain

Pilihan konsisten dari artikel lain