Error onclick function not defined berarti browser tidak menemukan fungsi itu di scope global saat tombol diklik. Perbaikan paling cepat: buka Console, samakan nama fungsi di HTML dan JS, lalu pastikan script dimuat sebelum tombol dipakai dan tidak terbungkus module.
Penyebab Onclick Function Not Defined di Browser
Pesan Uncaught ReferenceError: functionName is not defined muncul karena atribut onclick="..." hanya mencari fungsi di objek window.
- Fungsi dibungkus
type="module", IIFE, atau dideklarasikan di dalamDOMContentLoadedsehingga tidak global. - Typo nama fungsi, beda huruf besar kecil antara
onclick="submitForm()"danfunction submitform(). - File JS gagal dimuat karena salah path, urutan script terbalik, atau error sintaks menghentikan eksekusi.
- Ada dua fungsi dengan nama sama, fungsi kedua menimpa atau file JS tidak tersimpan.
Tabel Troubleshooting Cepat
Buka DevTools dengan F12, lihat Console untuk pesan error, lalu cek tab Sources apakah file JS benar-benar termuat.
| Error/Kondisi | Penyebab | Solusi |
|---|---|---|
| ReferenceError: submitForm is not defined | Fungsi tidak global karena module atau scope lokal | Ekspos ke window atau pakai addEventListener |
| Klik tombol tidak bereaksi tanpa error | Logic error, nama fungsi mirip tapi salah | Samakan ejaan onclick dan deklarasi fungsi |
| Fungsi ada tapi error hanya kadang muncul | Script dimuat setelah HTML atau defer salah | Pindah script ke akhir body atau pakai defer |
Cara Memperbaiki Onclick Not Defined Langkah per Langkah
Ikuti urutan ini agar sumber masalah ketahuan tanpa menebak.
- Samakan nama fungsi di HTML
onclick="kirimData()"denganfunction kirimData()di JS. - Pastikan file JS termuat. Cek tab Network, perbaiki atribut
srcbila status 404. - Jika memakai
type="module", pindahkan fungsi ke global atau ganti keaddEventListener. - Atur urutan script. Letakkan script sebelum tombol dipakai atau tambah
defer.
<!-- SALAH: fungsi di dalam module tidak terbaca onclick -->
<script type="module">
function submitForm() {
alert("terkirim");
}
</script>
<button onclick="submitForm()">Kirim</button>
<!-- BENAR -->
<button id="btnKirim">Kirim</button>
<script>
function submitForm() {
alert("terkirim");
}
window.submitForm = submitForm;
document.getElementById("btnKirim").addEventListener("click", submitForm);
</script>
Versi benar bekerja karena fungsi tersedia di window untuk onclick inline, sekaligus terikat langsung lewat addEventListener. Cara kedua lebih aman karena tidak bergantung pada scope global.
Cara Mencegah Error Terulang
- Gunakan
addEventListenersetelah DOM siap, misalnya script di akhirbody. - Hindari onclick inline untuk elemen yang dibuat lewat JS. Gunakan event delegation pada parent seperti
document.body.addEventListener("click"). - Konsisten memakai satu sistem. Pilih semua script biasa atau semua module, jangan campur tanpa pemisah jelas.
FAQ
Kenapa fungsi sudah ada tapi onclick tetap not defined?
Fungsi itu kemungkinan berada di dalam module, IIFE, atau callback sehingga tidak masuk scope global.
Apakah harus memakai window.namaFungsi agar onclick jalan?
Hanya wajib bila script memakai module atau scope tertutup, untuk script biasa cukup deklarasi fungsi top-level.
Kapan pindah dari onclick inline ke addEventListener?
Pindah saat elemen dibuat dinamis, butuh beberapa handler, atau kode mulai sulit dilacak karena HTML dan JS tercampur.