Change event tidak terpanggil biasanya karena selector mengarah ke elemen yang tidak ada, script berjalan sebelum DOM siap, atau nilai diubah lewat kode tanpa memicu event. Periksa console dulu, pastikan tidak ada TypeError: Cannot read properties of null dari addEventListener, lalu cek apakah input dibuat dinamis setelah listener dipasang.
Penyebab Change Event Tidak Terpanggil di Browser
Penyebab paling sering ada pada timing dan target listener:
- Script jalan sebelum DOM siap sehingga
querySelectormengembalikannull. - ID atau class salah tulis, ada spasi, huruf besar kecil beda, atau ID ganda.
- Listener dipasang ke elemen statis, padahal input dibuat belakangan lewat JavaScript.
- Nilai diubah lewat kode seperti
input.value = "baru"tanpadispatchEvent. - Elemen berstatus
disabled, salah tipe elemen, atau tertutup elemen lain sehingga tidak bisa berubah.
Tabel Troubleshooting Change Event
Cocokkan kondisi form dengan tabel ini sebelum mengubah banyak kode:
| Kondisi | Penyebab | Solusi cepat |
|---|---|---|
| Semua input tidak merespons | Selector salah atau DOM belum siap | Cek console.log(el) dan pindah script ke akhir body |
| Checkbox, radio, select diam | Listener hanya untuk input text awal | Pasang ulang listener atau pakai delegasi ke parent |
| Value diubah lewat kode | Perubahan programatik tidak memicu change | Panggil dispatchEvent(new Event("change")) |
| Input file tidak jalan dua kali | File sama dipilih ulang | Kosongkan input.value setelah diproses |
Cara Memperbaiki dengan Langkah Bernomor dan Kode
Ikuti urutan ini agar akar masalah ketemu:
- Pastikan DOM siap dengan menaruh script setelah elemen atau memakai
DOMContentLoaded. - Cek selector lewat
console.logdan pastikan hasilnya bukannull. - Pasang listener
changelangsung untuk form statis. - Gunakan delegasi event bila input dibuat dinamis.
- Picu event manual bila nilai diubah lewat kode.
// SALAH: elemen belum ada saat kode jalan
const kota = document.querySelector("#kota");
kota.addEventListener("change", () => {
console.log(kota.value);
});
// BENAR: tunggu DOM, lalu tangani dinamis dengan delegasi
document.addEventListener("DOMContentLoaded", () => {
document.body.addEventListener("change", (e) => {
if (e.target.id === "kota") {
console.log(e.target.value);
}
});
});
// Perubahan via kode perlu event manual
const kota = document.querySelector("#kota");
kota.value = "Jakarta";
kota.dispatchEvent(new Event("change"));
Delegasi memakai satu listener di parent, jadi input baru tetap tertangkap. Panggilan dispatchEvent membuat handler change berjalan normal.
Cara Mencegah Agar Tidak Terulang
- Selalu pasang script setelah DOM atau bungkus dengan
DOMContentLoaded. - Gunakan event delegation untuk daftar dinamis dan hindari ID ganda.
- Pakai
textContentbila hanya menampilkan teks, lalu uji di checkbox, select, dan input file.
FAQ
Kenapa change di input text baru jalan setelah blur?
Browser memicu change pada input text setelah nilai dikonfirmasi dan fokus lepas.
Kenapa change tidak jalan saat value diubah lewat JavaScript?
Perubahan lewat kode tidak memicu event bawaan, jadi panggil dispatchEvent manual.
Kapan memakai input bukan change untuk form?
Pakai input bila butuh respons tiap ketikan, terutama validasi langsung dan pencarian.