Event Bubbling & Delegation 🫧
Ini adalah teknik rahasia buat Hemat Memori dan ngatasin masalah Elemen Dinamis.
1. Konsep Bubbling (Gelembung) 🛁
Bayangin lo ngelempar batu ke dasar kolam. Gelembung udaranya bakal naik ke atas, kan? Event di JS juga gitu.
Kalau lo klik sebuah tombol:
- Event
clickkena ke Tombol dulu. - Terus naik ke Bapaknya (Container).
- Terus naik ke Kakeknya (Body).
- Sampe ke paling atas (Document).
Jadi, kalau Bapaknya dipasang addEventListener, dia BISA TAU kalau anaknya diklik.
2. Masalah Cara Lama 😫
Biasanya kita pasang listener di tiap tombol kayak gini:
const semuaTombol = document.querySelectorAll(".hapus");
// Kalau ada 1000 tombol, lo bikin 1000 Event Listener di memori.
// BOROS BANGET!
semuaTombol.forEach((btn) => {
btn.addEventListener("click", hapusItem);
});Masalah Fatal: Kalau lo nambahin item baru pake JS (createElement), item baru itu GAK PUNYA event listener (karena dia lahir belakangan). Jadi tombol hapusnya gak bakal jalan.
3. Solusi: Event Delegation (Titip ke Bapak) 🤝
Daripada pasang di tombol satu-satu, mending pasang SATU AJA di bapaknya (misal <ul> atau container).
const container = document.querySelector("#list-belanja");
// Pasang kuping di BAPAKNYA
container.addEventListener("click", function (e) {
// Cek: Apakah yang diklik itu tombol hapus?
if (e.target.className == "btn-hapus") {
// Ya! Hapus bapak dari tombol itu (si <li>)
e.target.parentElement.remove();
console.log("Tombol hapus diklik!");
}
});Keuntungan Delegation:
-
Hemat Memori: Cuma 1 Event Listener buat ribuan tombol.
-
Anti Ribet: Item baru yang ditambahkan belakangan OTOMATIS bisa diklik juga. Gak perlu pasang listener ulang.
Analogi: Daripada HRD nyuruh 100 karyawan lapor satu-satu (capek), mending HRD bilang ke Ketua Divisi: "Eh, kalau ada anak buah lo yang mau cuti, lapor ke gue ya." Lebih efisien kan?