Cara mengatasi click event jalan dua kali javascript paling cepat adalah melepas listener ganda lalu menghentikan bubbling yang tidak perlu. Cek dulu apakah fungsi bind dipanggil dua kali, setelah itu perbaiki dengan guard, removeEventListener, atau stopPropagation sesuai penyebabnya.
Penyebab Click Event Jalan Dua Kali di Browser
Fungsi terpanggil dua kali hampir selalu berarti browser mengeksekusi dua listener untuk satu klik. Polanya berulang pada tiga kondisi ini.
addEventListenerterpasang dua kali karena script dimuat ulang atau fungsiinit()dipanggil setiap render.- Event bubbling dari child ke parent membuat dua listener aktif, misalnya tombol di dalam card yang sama-sama mendengarkan
click. - Tombol di dalam
formmemicuclicksekaligussubmit, sehingga handler jalan lalu halaman ikut reload.
Tabel Diagnosis Klik Ganda dengan Cepat
Samakan gejala yang muncul dengan baris tabel supaya perbaikan tidak salah sasaran.
| Kondisi | Penyebab | Solusi |
|---|---|---|
console.log muncul dua kali |
Listener dipasang dua kali | Pindahkan bind keluar fungsi berulang |
| Counter bertambah dua | Init dipanggil setiap render | Tambah guard sebelum bind |
| Aksi parent ikut jalan | Bubbling child ke parent | Pakai stopPropagation |
Cek listener aktif lewat getEventListeners(element) di Chrome DevTools. Audit juga kode init, pastikan tidak dipanggil dari dua tempat berbeda.
Cara Memperbaiki Listener yang Terpasang Ganda
Ikuti urutan ini supaya listener lama tidak menumpuk.
- Pastikan DOM siap sebelum bind, misalnya dengan menaruh script di akhir body atau memakai
DOMContentLoaded. - Pindahkan
addEventListenerkeluar dari fungsi yang dipanggil berulang. - Gunakan flag guard atau
removeEventListenerbila tombol memang harus di-bind ulang. - Tambahkan
stopPropagationhanya bila parent dan child sama-sama butuh listener.
// SALAH: dipanggil setiap render
function init() {
document.querySelector("#kirim").addEventListener("click", kirimData);
}
init();
init();
// BENAR
const tombol = document.querySelector("#kirim");
if (!tombol.dataset.bound) {
tombol.dataset.bound = "true";
tombol.addEventListener("click", (event) => {
event.stopPropagation();
kirimData();
});
}
Atribut data-bound mencegah bind kedua. Pemanggilan stopPropagation memutus rambatan klik ke parent, sehingga kirimData hanya jalan sekali.
Cara Mencegah Klik Ganda Terulang
- Gunakan event delegation satu kali untuk elemen dinamis, misalnya satu listener di parent daftar tombol.
- Nonaktifkan tombol sementara saat
fetchberjalan, lalu aktifkan lagi setelah respons selesai. - Pisahkan fungsi bind agar tidak dipanggil setiap render atau setiap perubahan state.
FAQ
Kenapa console.log click muncul dua kali padahal klik sekali?
Listener yang sama biasanya terpasang dua kali karena fungsi init berjalan berulang.
Apakah stopPropagation selalu memperbaiki klik ganda?
Tidak, ia hanya tepat untuk kasus bubbling dari child ke parent.
Bagaimana mencegah double submit saat tombol diklik cepat?
Nonaktifkan tombol selama request berjalan atau gunakan flag proses sedang aktif.