Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Web Geliştirmede `Event Delegation` ile Daha Akıllı ve Performanslı Kod Yazma Rehberi 🧠

devnix

Üye
Katılım
14 Mart 2026
Mesajlar
10
Web Geliştirmede `Event Delegation` ile Daha Akıllı ve Performanslı Kod Yazma Rehberi 🧠

Selam dostlar! 👋 Uzun süredir forumda takılıyorum ve bugün sizlerle, özellikle dinamik arayüzler geliştirirken hayat kurtaran bir konuyu, **Event Delegation**'ı (Olay Temsilciliği) konuşmak istiyorum. Bu teknik, hem kodunuzu temizler hem de performansınızı gözle görülür şekilde artırır. Gelin birlikte inceleyelim.

Event Delegation Nedir ve Neden İhtiyaç Duyarız?

Basitçe anlatmak gerekirse, **Event Delegation**, bir üst (ebeveyn) elemente bir olay dinleyicisi ekleyip, bu elementin altındaki (çocuk) elementlerde meydana gelen olayları, JavaScript'in olay kabarcıklanması (event bubbling) özelliğini kullanarak yönetme tekniğidir. 🫧

Neden böyle bir şeye ihtiyaç duyarız? Şu senaryoyu düşünün:
  • Bir `ul` listeniz var ve içinde 100 tane `li` (liste öğesi) bulunuyor.
  • Her bir `li`'ye tıklandığında bir işlem yapılmasını istiyorsunuz.
  • Naif yaklaşım, her bir `li` elementine ayrı ayrı `addEventListener` eklemek olurdu. Bu, 100 adet olay dinleyicisi demektir! Bu da bellek kullanımını artırır ve potansiyel performans sorunlarına yol açar.
  • Peki ya bu `li`'ler dinamik olarak eklenip kaldırılıyorsa? Her eklemede yeni bir dinleyici bağlamak, her kaldırmada da onu temizlemek zorunda kalırsınız. Karmaşa kaçınılmazdır.

İşte tam burada **Event Delegation** devreye giriyor ve bizi bu zahmetten kurtarıyor. Tek bir dinleyici ile hepsini halleder! ⚙️

Event Delegation Nasıl Çalışır? (Olay Kabarcıklanması)

Bu tekniğin temelinde **Event Bubbling** yatar. Tarayıcıda bir elemente tıklandığında, olay sadece o elementte tetiklenmez. Önce hedef elementte başlar, sonra sırasıyla üst elementlere doğru "kabarcıklanarak" yükselir. Yani `li`'ye tıklanınca, olay sırasıyla `li` > `ul` > `body` > `html` > `document` yolunu izler.

Biz de bu özelliği kullanarak, dinleyiciyi en üstteki sabit bir elemente (örneğin `ul`) bağlarız. `ul`'deki dinleyici, altındaki *herhangi* bir `li`'den yukarı kabarcıklanarak gelen tıklama olayını yakalar.

Pratik Örnek: Dinamik Todo Listesi

Klasik bir örnekle pekiştirelim. Dinamik olarak yeni görevler ekleyebildiğimiz bir todo listesi yapalım.

Kod:
<!-- HTML -->
<button id="addBtn">Yeni Görev Ekle</button>
<ul id="todoList">
  <li>Kahve al <button class="delete">Sil</button></li>
  <li>Kod yaz <button class="delete">Sil</button></li>
</ul>

Kod:
// JavaScript - Event Delegation KULLANARAK
const todoList = document.getElementById('todoList');
const addBtn = document.getElementById('addBtn');

// 1. Sil butonları için DELEGASYON: Tek dinleyici tüm 'sil' butonlarını yönetir.
todoList.addEventListener('click', function(event) {
  // Olayın tetiklendiği asıl hedef element
  const clickedElement = event.target;

  // Eğer tıklanan element 'delete' sınıfına sahip bir butonsa
  if (clickedElement.classList.contains('delete')) {
    // Bu butonun içinde bulunduğu li elementini bul ve kaldır
    const listItem = clickedElement.closest('li');
    listItem.remove();
    console.log('Görev silindi (Delegation ile)!');
  }

  // Aynı dinleyici içinde li'ye tıklama işlemi de ekleyebiliriz (örneğin tamamlandı işaretleme).
  if (clickedElement.tagName === 'LI') {
    clickedElement.classList.toggle('completed');
  }
});

// 2. Yeni görev ekleme
addBtn.addEventListener('click', function() {
  const newTask = prompt('Yeni görev nedir?');
  if (newTask) {
    const newLi = document.createElement('li');
    newLi.textContent = newTask + ' ';
    const deleteBtn = document.createElement('button');
    deleteBtn.textContent = 'Sil';
    deleteBtn.className = 'delete';
    newLi.appendChild(deleteBtn);
    todoList.appendChild(newLi);
    // DİKKAT: Yeni eklenen buton için ayrıca addEventListener ÇAĞIRMIYORUZ!
    // Üstteki delegation dinleyicisi otomatik olarak onu da yakalayacak.
  }
});

Gördüğünüz gibi, `#todoList` üzerindeki **tek bir `click` dinleyicisi**, hem mevcut hem de gelecekte eklenecek tüm `li` ve `.delete` butonlarının olaylarını yönetiyor. Bu, kodun hem daha temiz hem de çok daha verimli olmasını sağlıyor. 🚀

Event Delegation'un Avantajları
  • Performans: Bellekte çok daha az olay dinleyicisi tutulur. Özellikle çok sayıda öğe içeren listelerde (tablolar, galeriler) fark yaratır.
  • Dinamik Element Desteği: Sayfaya sonradan eklenen elementler için ayrıca olay bağlamanıza gerek kalmaz. Delegasyon onları otomatik olarak kapsar.
  • Daha Temiz Kod: Tek bir merkezi dinleyici, birçok öğe için tek tip mantık yürütmenizi sağlar. Kod bakımı kolaylaşır.
  • Bellek Sızıntısı Riskini Azaltma: Dinamik olarak kaldırılan elementlerin dinleyicilerini temizlemeyi unutma riskiniz ortadan kalkar.

Dikkat Edilmesi Gereken Noktalar
  • event.target: Her zaman işlem yapmak istediğiniz asıl element olmayabilir. Örneğin, `li` içindeki `button`'a değil de `strong` etiketine tıklanmış olabilir. `closest()` metodu gibi yöntemlerle hedefinizi doğrulayın veya bulun.
  • Olayın Durdurulması: Alt elementlerde `event.stopPropagation()` çağrılırsa, olay üste kabarcıklanmaz ve delegation dinleyiciniz çalışmaz. Mümkünse bundan kaçının.
  • Çok Fazla Delegasyon: `document` veya `body` gibi çok üst seviyelere çok sayıda delegation dinleyicisi eklemek, her tıklamada çok fazla kontrol yapılmasına neden olabilir. Mümkün olduğunca işin gerçekleştiği en yakın ortak üst elemente bağlayın.

**Sonuç olarak,** Event Delegation, modern ve ölçeklenebilir web uygulamaları geliştirmek isteyen her frontend geliştiricinin araç kutusunda mutlaka bulunması gereken güçlü bir tekniktir. 💻

Başlangıçta biraz farklı gelebilir, ancak bir kez alıştığınızda, özellikle dinamik içeriklerle çalışırken onun ne kadar büyük bir kolaylık sağladığını göreceksiniz.

Herkese temiz ve hızlı kodlar! ✨ Sorularınızı yorumlarda bekliyorum.
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri