2013-03-08 17 views
14

İlk önce, "Mutasyon gözlemcisi nasıl oluşturulur?" post ve ben API'leri gördük.Tetiklenmiş MutationObserver için nasıl bir yığın izini alırsınız?

Bir mutasyonun meydana geldiği zamanın "kaynağını" göstermenin bir yolunu bilen birini merak ediyordum. Büyük olasılıkla bir tür geçici çözüm olabilirdi - API dokümanlarında bundan bahsedemiyorum.

Ben bir eleman none onun display yılında style set oluyor nerede olduğunu bulmak için çalışıyorum. nerede JS kaynağında

{ 
    addedNodes: NodeList[] 

    attributeName: "style" 

    attributeNamespace: null 

    newValue: "display: none;" 

    nextSibling: null 

    oldValue: "" 

    previousSibling: null 

    removedNodes: NodeList[] 

    target: li#d526d311-e6e0-4ef1-a3a1-f8686bbb468f.group 

    type: "attributes" 

} 
Sadece istiyorum

bilmek:

var observer = new MutationObserver(function(mutations) { 
    mutations.forEach(function (mutation) { 
     if (mutation.attributeName === "style") { 
      var extendedMutation = _.extend({}, mutation, { 
       newValue: $(mutation.target).attr("style") 
      }); 

      console.log(extendedMutation); 
     } 
     }); 
}); 

observer.observe(row.element[0], { attributes: true, attributeOldValue: true }); 

Sunucu mutasyon olayları var ve onlar bu çizgisinde bak:

Benim kod şöyle görünür Geliyor! Herhangi bir fikir?

Lütfen ctrl + f'yi denedim, ancak boşuna. (Chrome için WebkitMutationObserver çalıştı aynı sonuç)

Debugger/İstisna çıkışı:

http://i.imgur.com/jYeqCPX.png

cevap

4

MutationObserver API sadece Ajax gibi, asenkron olduğunu. Chrome'da an example düşünün:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "/"); 
xhr.onload = function() { debugger; }; 
xhr.send(); 

muhtemelen farkında olarak geçerli işlevi yürütme yapıldıktan sonra, onload bazen kadar çalışmaz. Böylece, onloaddebugger çağrı çalıştırdığınızda, işlev çağrı yığını zorunlu olarak temizlendi ve onload işleyicisi yeni bir yığın üzerinde çalışır.

Sen mülkiyet mutasyon olur nerede olduğunu bilmek istiyorum, ama bir yığın izleme söz konusu bilgileri alamayan - bu xhr.send() denirdi nerede onload işleyici açısından, öğrenmeye çalışıyorum gibi olurdu.

+0

Yürütmenin bir "dizisi", uyumsuz olduğu anlamına gelmez, "tarih öncesi" yi, yani çağrıldığındaki noktadan önce gerçekleşen şeyin anlık görüntüsünü izlemekte zorluk çekmeniz gerekir. Bir Ajax çağrısı ile (örneğin) Ajax çağrısına yol açan yığın izleme dizesini Ajax nesnesini sarmaya söz verebilirsiniz. MutationObserver ile bu imkansız görünüyor. Can sıkıcı. –

9

Bu iş parçacığının çok eski olduğunu biliyorum, ancak şu anda Chrome'dan bir zaman uyumsuz çağrıyı izlemek için bir araç olduğunu belirtmek isterim.

Chrome çağrı yığını Eşzamansız bir aramanın geri izlemesini gerçekleştireceğimi düşündüğüm Async seçeneği. Bu seçenek Geliştirici araçları -> Çağrı yığını sekmesinde bulunabilir. Ve Async seçeneğini açıp MutationObserver geri çağırma işlevinde mola noktasını koyarak tam çağrı yığınını görebilirdik.

Yardım edin.

+0

IMO, bu en iyi olandan daha iyi bir cevap. – candrews

+0

Whoops! Bu "async" onay kutusunun şu anda Chrome DevTools'tan eksik olduğu anlaşılıyor (v 60.0 ...). Belki başka bir yere gitti? FF için böyle bir şey var mı? Chrome'dan nefret ediyorum. –

İlgili konular