Pesan NotFoundError: Failed to execute 'removeChild' on 'Node' berarti node yang kamu hapus bukan anak langsung dari parent yang memanggilnya. Browser menolak operasi itu karena parent.removeChild(child) hanya berlaku untuk relasi satu tingkat. Perbaikannya cepat: cek parent.contains(child) dulu, atau pakai child.remove() bila kamu tidak perlu tahu parentnya.
Arti Error NotFoundError pada removeChild
Error ini murni masalah DOM di browser, bukan error Node.js. Browser menemukan parentnya, menemukan childnya, tetapi hubungan keduanya tidak cocok.
NotFoundErrorpadaremoveChild: child bukan anak langsung parent tersebut.TypeError: Cannot read properties of null: parent atau child-nya sendirinullkarena selector salah atau DOM belum siap.- Kalau node yang dihapus adalah cucu, kamu wajib memanggil
removeChildlewat parent langsungnya, bukan kakeknya.
Penyebab RemoveChild Node Not Found Paling Sering
Tiga pola ini paling sering memicu error, terutama pada daftar dinamis dan komponen yang render ulang:
- Parent keliru setelah render ulang atau setelah struktur HTML berubah.
- Child diambil ulang dengan selector berbeda sehingga merujuk node lain.
- Child sudah dihapus sebelumnya, lalu dihapus kedua kali dengan referensi basi.
| Error/Kondisi | Penyebab | Solusi |
|---|---|---|
| NotFoundError saat hapus item | Parent bukan induk langsung | Gunakan child.parentNode.removeChild(child) |
| Error setelah render ulang | Referensi DOM basi | Ambil ulang elemen sebelum menghapus |
| Error hapus dua kali | Node sudah lepas dari DOM | Cek contains sebelum removeChild |
Cara Memperbaiki RemoveChild yang Gagal
Ikut urutan ini agar hubungan parent dan child selalu valid:
- Pastikan parent dan child tidak
nullsetelahquerySelector. - Cek hubungan dengan
parent.contains(child). - Hapus hanya bila hasilnya
true.
// SALAH: item adalah cucu, bukan anak listWrapper
listWrapper.removeChild(item);
// BENAR
if (listWrapper.contains(item)) {
listWrapper.removeChild(item);
}
// Alternatif paling sederhana
item.remove();
Kode benar memakai contains sebagai penjaga sebelum removeChild. Baris item.remove() lebih praktis karena browser otomatis mencari parent langsungnya.
Cara Mencegah Error Terulang
- Validasi hubungan parent-child setiap menghapus node dinamis.
- Gunakan
child.remove()untuk penghapusan satu elemen tanpa logika parent khusus. - Simpan referensi DOM yang segar, jangan memakai variabel lama setelah
innerHTMLdiganti. - Untuk daftar dinamis, hapus lewat event delegation dari tombol yang diklik.
FAQ
Apakah removeChild bisa menghapus cucu tanpa parent langsung?
Tidak bisa, panggil lewat parent langsungnya atau gunakan child.remove().
Kapan memakai remove dibanding removeChild?
Pakai remove() untuk kasus sederhana, pakai removeChild() bila kamu perlu referensi parent lama.
Kenapa contains true tapi removeChild tetap gagal?
Umumnya referensi berubah di antara pengecekan dan penghapusan karena render ulang atau penghapusan ganda.