2015-06-12 20 views
20

Bazı DOM düğümlerimdeki değişiklikleri gözlemlemek için MutationObserver nesnesini kullanmak istiyorum.Tek bir MutationObserver nesnesi birden çok hedefi gözlemleyebilir mi?

Dokümanlar, bir MutationObserver nesnesi oluşturma ve bir hedefe kaydetme örneği verir.

// select the target node 
var target = document.querySelector('#some-id'); 

// create an observer instance 
var observer = new MutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
    console.log(mutation.type); 
    });  
}); 

// configuration of the observer: 
var config = { attributes: true, childList: true, characterData: true }; 

// pass in the target node, as well as the observer options 
observer.observe(target, config); 

yukarıda kod var ki, ama sadece bunun altında ben bu kodu yerleştirebilirsiniz:

var target2 = document.querySelector('#some-other-id'); 
var config2 = {attributes: true, subtree: true}; 
observer.observe(target2, config2); 

Will observer:

  • şimdi olmak 2 hedeflerini gözlemleyerek? target izlemeye son vermeyecek mi?
  • target2 gözlemlememeye karar verecek mi?
  • hata veriyor mu?
  • veya başka bir davranış sergileyecek mi?

cevap

21

Gözlemciler, tanımlarınız için iki hedefi - target ve target2 izleyecekler. Hiçbir hata atılmayacak ve target, target2 lehine "kayıtsız" olmayacaktır. Beklenmeyen ya da başka davranışlar sergilenmeyecektir.

İşte iki toparlanabilir öğe üzerinde aynı MutationObserver kullanan bir örnek. Bunu görüntülemek için, her contenteditable öğesinden <span> düğümünü silin ve gözlenen her iki öğedeki davranış açıklığını görüntüleyin.

<div id="myTextArea" contenteditable="true"> 
    <span contenteditable="false">Span A</span> 
</div> 

<div id="myTextArea2" contenteditable="true"> 
    <span contenteditable="false">Span B</span> 
</div> 

var observer = new MutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
     //console.log($(mutation.removedNodes)); // <<-- includes text nodes 

     $(mutation.removedNodes).each(function(value, index) { 
      if(this.nodeType === 1) { 
       console.log(this) 
      } 
     }); 
    }); 
}); 

var config = { attributes: true, childList: true, characterData: true }; 

observer.observe($('#myTextArea')[0], config); 

observer.observe($('#myTextArea2')[0], config); 

JSFiddle Link

- Yeni bir yapılandırma yerleştirerek, bu ilk demo için aynı yapılandırma geri dönüşümlü, ama demo

Not gözlenilen elemana özel olacak. Örneğinizi config2'da tanımlandığı şekilde alarak, #myTextArea2'da kullanılıyorsa, yapılandırma seçenekleri için günlüğe kaydedilmiş düğümü göremezsiniz, ancak #myTextArea gözlemcisinin etkilenmediğini fark edersiniz.

JSFiddle Link - demo - yapılandırma seçkinlik

+1

Çok güzel! Bu, tüm tarayıcılarda tutarlı bir şekilde çalışıp çalışmadığını merak etse de, gözlemlemeye başladığınız bir öğenin içinde bir öğeyi gözlemlediğinizde tutarlı olup olmadığını merak ediyorum. – NoBugs

+3

Ayrıca dikkat edilmesi gereken bir şey, aynı hedefi birden fazla kez gözlemlemenin, o öğedeki değişiklikler için geri aramada birden çok çağrıya neden olmamasıdır. –

+0

@NoBugs @ major-mann Aynı element üzerindeki çoklu gözlemler veya 2 element üzerinde gözlemler - birinin diğeri içinde olduğu - çoklu mutasyon kayıtlarına (veya çoklu 'mutation.addedNodes') neden olur. Chrome 56'da test ettiğimde fonksiyon. – jdunk

İlgili konular