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 `MutationObserver` API: Dinamik Arayüzlerinizi Gözlemleyin ve Kontrol Edin 🕵️‍♂️

byteon

Üye
Katılım
14 Mart 2026
Mesajlar
9
Web Geliştirmede `MutationObserver` API: Dinamik Arayüzlerinizi Gözlemleyin ve Kontrol Edin 🕵️‍♂️

Selam dostlar! Uzun süredir forumda yazı yazmıyordum, bugün canım biraz teknik ve pratik bir konuya değinmek istedi. Özellikle single-page application (SPA)'lar veya sürekli DOM'u değiştiren dinamik web uygulamaları geliştiriyorsanız, bu yazı tam size göre. Bahsedeceğim şey, DOM'daki değişiklikleri "dinlemenizi" sağlayan çok güçlü ama belki de az bilinen bir JavaScript API'si: MutationObserver. ⚙️

Neden MutationObserver'a İhtiyaç Duyarız?

Eskiden, DOM'da bir şeyler değiştiğinde bunu takip etmek için Mutation Events vardı. Ancak performans sorunları ve karmaşıklığı nedeniyle artık kullanılmıyor (hatta deprecated). İşte burada MutationObserver devreye giriyor. Performansı yüksek ve çok daha kontrollü bir şekilde, DOM'un belirli bir bölümündeki değişiklikleri asenkron olarak gözlemlemenizi sağlıyor.

Pratikte ne işe yarar?
  • Üçüncü parti bir script veya kütüphane DOM'unuza müdahale ediyor ve siz bu değişiklikleri yakalamak/tepki vermek istiyorsunuz.
  • Kullanıcı etkileşimiyle veya AJAX çağrılarıyla dinamik olarak eklenen elementler için belirli işlemler (örneğin, hepsine event listener eklemek) yapmanız gerekiyor.
  • WYSIWYG editörü gibi, içeriğin sürekli değiştiği bileşenler geliştiriyorsunuz.
  • Sayfaya enjekte edilen reklam veya banner'ların yüklenip yüklenmediğini kontrol etmek istiyorsunuz.

MutationObserver Nasıl Çalışır? Temel Adımlar

Kullanımı oldukça basit bir pattern'i takip eder. Hemen basit bir örnekle gösterelim:

```javascript
// 1. ADIM: Bir Observer (Gözlemci) Oluştur
const observer = new MutationObserver(function(mutationsList) {
// 3. ADIM: Değişiklik olduğunda burası çalışacak (callback fonksiyonu)
for(let mutation of mutationsList) {
if (mutation.type === 'childList') {
console.log('Bir element eklendi veya kaldırıldı!', mutation.addedNodes);
}
else if (mutation.type === 'attributes') {
console.log(`'${mutation.attributeName}' özelliği değişti.`, mutation.target);
}
}
});

// 2. ADIM: Gözlemlemek İstediğiniz Hedef Elementi ve Konfigürasyonu Belirleyin
const targetNode = document.getElementById('dinamikIcerik');
const config = {
childList: true, // Alt element ekleme/silme değişikliklerini izle
attributes: true, // Nitelik (attribute) değişikliklerini izle
subtree: true, // Tüm alt soyu (descendants) izle
attributeFilter: ['class', 'style'] // Sadece belirli attribute'leri izle (isteğe bağlı)
};

// Gözlemi Başlat!
observer.observe(targetNode, config);

// İleride gözlemi durdurmak isterseniz:
// observer.disconnect();
```

Config (Yapılandırma) Seçenekleri Nelerdir?

Observer'ınızın neyi "dinleyeceğini" bu config nesnesi belirler. İşte anahtar seçenekler:
  • childList: Hedef node'un altına doğrudan çocuk (child) node'lar eklenip kaldırıldığında tetiklenir. (Varsayılan: false)
  • attributes: Hedef node'un niteliklerinde (class, id, data-* vb.) değişiklik olduğunda tetiklenir. (Varsayılan: false)
  • characterData: Metin (text) node'larının içeriği değiştiğinde tetiklenir. (Varsayılan: false)
  • subtree: Yukarıdaki değişikliklerin sadece hedef node'da değil, tüm alt soyunda (descendants) da izlenmesini sağlar. Çok güçlü bir seçenek! (Varsayılan: false)
  • attributeOldValue: `true` yaparsanız, mutation nesnesi içinde değişen niteliğin eski değerini de alırsınız. (Varsayılan: false)
  • characterDataOldValue: `characterData` için eski değeri saklar. (Varsayılan: false)
  • attributeFilter: Sadece izlemek istediğiniz nitelik isimlerini bir dizi olarak belirtebilirsiniz (ör: `['class', 'data-status']`).

Gerçek Dünya Senaryosu: Dinamik Yorum Listesi

Diyelim ki bir blog sayfanız var ve kullanıcı "Daha fazla yorum göster" butonuna bastığında, yeni yorumlar AJAX ile gelip `#yorumListesi` içine ekleniyor. Bu yeni gelen yorumlardaki tüm linklere otomatik olarak `target="_blank"` eklemek istiyorsunuz. İşte MutationObserver burada kurtarıcı olabilir! 🚀

```javascript
const yorumObserver = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length) {
// Eklenen her yeni node içinde linkleri bul
mutation.addedNodes.forEach(function(node) {
if (node.nodeType === 1) { // Sadece Element Node'ları kontrol et
const linkler = node.querySelectorAll ? node.querySelectorAll('a') : [];
linkler.forEach(function(link) {
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener noreferrer'); // Güvenlik için
});
}
});
}
});
});

const yorumListesi = document.getElementById('yorumListesi');
if(yorumListesi) {
yorumObserver.observe(yorumListesi, { childList: true, subtree: true });
}
```

Artık ne zaman yeni bir yorum eklenirse, içindeki linkler otomatik olarak yeni sekmede açılacak şekilde işaretlenecek. Harika değil mi?

Dikkat Edilmesi Gerekenler ve Performans İpuçları

  • Abartmayın! Her yere Observer bağlamak, özellikle `subtree: true` ile birlikte, performansı olumsuz etkileyebilir. Sadece ihtiyacınız olan yerde ve mümkün olan en spesifik konfigürasyonla kullanın.
  • İşiniz Bittiğinde Durdurun. `observer.disconnect()` metodunu kullanmayı unutmayın. Örneğin, bir bileşen sayfadan kaldırıldığında (SPA'larda) observer'ı da temizlemelisiniz. Aksi takdirde bellek sızıntısı (memory leak) oluşabilir.
  • Callback İçinde Ağır İşlemler Yapmayın. Callback fonksiyonu, her küçük değişiklikte bile çalışabilir. İçinde DOM sorguları veya ağır hesaplamalar yapmaktan kaçının. Mümkünse hafif tutun veya `setTimeout` ile throttle/debounce edin.
  • MutationObserver, değişiklikleri asenkron olarak bildirir. Yani değişiklik anında callback çalışmaz, mikro görev (microtask) kuyruğuna eklenir.

Sonuç

MutationObserver, modern web geliştirmede DOM'un dinamik davranışını yönetmek için vazgeçilmez bir araçtır. 🧠 Özellikle framework'lerin arka planda nasıl çalıştığını anlamak, kendi kütüphanenizi yazmak veya mevcut bir sayfadaki kontrolü dışındaki değişiklikleri yakalamak istediğinizde son derece kullanışlıdır.

Başlangıçta biraz karmaşık gelebilir, ancak birkaç deneme yaparak ne kadar güçlü olduğunu göreceksiniz. Projelerinizde mutlaka bir köşede dursun.

Umarım faydalı olmuştur! Takıldığınız yer olursa yorumlarda konuşabiliriz. Kodla kalın! 💻
 

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