Javascript DOM Event Handling Form Interaction
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama JavaScript untuk melanjutkan topik lainnya.
Kembali ke rujukan utama JavaScript untuk melanjutkan topik lainnya.
DOM (Document Object Model) adalah representasi struktur HTML yang bisa diakses dan dimanipulasi dengan JavaScript. Melalui DOM, JavaScript dapat memilih elemen, membaca isi, mengubah atribut, menambah atau menghapus node, dan merespons interaksi pengguna.
Event handling adalah mekanisme untuk merespons aksi seperti klik, input, submit, focus, keydown, dan change. Saat event terjadi, browser membangkitkan event object dan mengirimkannya ke handler yang terdaftar.
Hampir semua interaksi web modern bergantung pada tiga hal ini:
Kalau alurnya tidak dipahami, bug yang muncul biasanya bentuknya sama:
preventDefault() tidak dipakaiJavaScript mengambil elemen DOM lewat API document dan Element.
document.getElementById(id) untuk satu elemen berdasarkan iddocument.querySelector(selector) untuk satu elemen pertama yang cocokdocument.querySelectorAll(selector) untuk semua elemen yang cocokelement.matches(selector) untuk mengecek apakah node cocok dengan selector tertentuelement.closest(selector) untuk naik ke ancestor terdekat yang cocokgetElementById() kalau targetnya unik dan stabil.querySelector() kalau perlu fleksibilitas selector CSS.querySelectorAll() kalau ingin koleksi elemen lalu diiterasi.closest() saat event delegation perlu mencari konteks dari target event.const form = document.querySelector('#signup-form');
const submitButton = document.getElementById('submit-btn');
const fields = document.querySelectorAll('.form-field');Selector yang baik itu bukan yang paling pendek, tetapi yang paling stabil dan mudah dirawat. Kalau struktur halaman sering berubah, selector berbasis class presentasional biasanya lebih rapuh dibanding id, data-*, atau struktur semantik yang jelas.
Saat event terjadi, browser membuat event object, menentukan target, lalu menjalankan listener sesuai fase event.
window/document turun ke target.Secara default, banyak event umum seperti click akan bubbling. Itu sebabnya satu listener di container bisa menangkap klik dari child di dalamnya.
Bubbling adalah pergerakan event dari elemen target naik ke parent, lalu ke parent di atasnya, sampai ke root.
Ini berguna karena:
Contoh:
<ul id="menu">
<li><button class="item">A</button></li>
<li><button class="item">B</button></li>
</ul>document.querySelector('#menu').addEventListener('click', (event) => {
if (event.target.matches('.item')) {
console.log('Item diklik:', event.target.textContent);
}
});Capturing berjalan dari luar ke dalam. Fase ini lebih jarang dipakai, tetapi berguna ketika kamu perlu mengamati event sebelum child menanganinya.
Untuk memakai capturing, listener didaftarkan dengan opsi { capture: true }.
container.addEventListener('click', handleClick, { capture: true });Capturing dipakai saat:
Dalam praktik sehari-hari, bubbling jauh lebih sering dipakai daripada capturing.
Ada beberapa metode yang sering dipakai saat event perlu dikontrol.
preventDefault()preventDefault() mencegah perilaku bawaan browser.
Contoh perilaku bawaan:
form.addEventListener('submit', (event) => {
event.preventDefault();
console.log('Validasi atau request AJAX di sini');
});Gunakan preventDefault() hanya kalau kamu memang ingin mengganti perilaku bawaan. Kalau tidak, biarkan browser bekerja seperti semestinya.
stopPropagation()stopPropagation() menghentikan event agar tidak lanjut ke ancestor.
Ini berguna kalau parent punya listener global, tetapi child harus diproses sendiri tanpa memicu handler container.
button.addEventListener('click', (event) => {
event.stopPropagation();
console.log('Hanya button ini yang diproses');
});stopImmediatePropagation()stopImmediatePropagation() lebih kuat: event berhenti, dan listener lain pada elemen yang sama juga tidak dijalankan.
Pakai ini sangat hati-hati karena efeknya cukup agresif.
Form adalah area paling umum untuk menggabungkan DOM selection, event handling, dan default behavior.
submit: saat form dikiriminput: setiap perubahan nilai saat mengetikchange: saat nilai dianggap berubah dan dikonfirmasi browserfocus dan blur: saat elemen mendapat atau kehilangan fokusinvalid: saat validasi native gagalpreventDefault() dipakai untuk mencegah reloadconst form = document.querySelector('#contact-form');
form.addEventListener('submit', async (event) => {
event.preventDefault();
const formData = new
Ada dua lapis validasi yang umum dipakai:
required, type="email", minlength, patternKalau validasi native cukup, jangan tambah JavaScript yang tidak perlu. Browser sudah punya banyak perilaku form yang matang.
const email = document.querySelector('#email').value;
const isChecked = document.querySelector('#terms').checked;
const selectedValue = document.querySelector('#role').value;Event delegation adalah pola menaruh listener di parent/container, lalu memeriksa event.target atau closest() untuk menentukan elemen mana yang sebenarnya diproses.
const list = document.querySelector('#todo-list');
list.addEventListener('click', (event) => {
const removeButton = event.target.closest('[data-action="remove"]');
if (!removeButton)
Delegation memindahkan kompleksitas dari banyak listener menjadi satu alur pemeriksaan target. Hasilnya biasanya lebih ringan, lebih mudah dirawat, dan lebih cocok untuk UI yang berubah setelah render.
DOMContentLoaded atau letakkan script di akhir body kalau elemen belum tentu sudah ada saat script berjalan.event.currentTarget untuk elemen tempat listener dipasang, dan event.target untuk elemen asal event.closest() agar hit detection lebih stabil.preventDefault() dipakai saat perilaku native perlu diganti.closest() sering dipakai untuk menangani target dalam struktur yang bersarang.