2013-03-08 32 views
14

首先,這不是「如何創建突變觀察者?」帖子和我看到的API。如何獲取觸發的MutationObserver的堆棧跟蹤?

我想知道是否有人知道一種方式來顯示突變發生時的「來源」。這很可能是某種解決方法 - 我在API文檔中看不到任何提及。

我想知道元素的displaystyle的設置爲none

我的代碼如下所示:

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 }); 

我有服務器突變事件和他們一起的臺詞看:

{ 
    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" 

} 

我只是想知道在JS源它來自!有任何想法嗎?

請注意我已經嘗試ctrl + f,但無濟於事。

調試器/異常輸出(試圖WebkitMutationObserver爲Chrome也,相同的結果):

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

回答

4

的MutationObserver API是異步的,就像Ajax的。在Chrome考慮an example

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

正如你可能知道,onload不運行,直到某個當前函數執行完畢後。因此,當onload中的debugger調用運行時,函數調用堆棧必須清除,並且onload處理程序在新堆棧上運行。

你想知道的財產突變發生,但你不能從一個堆棧跟蹤信息 - 這將是喜歡嘗試來了解xhr.send()被稱爲,從該onload處理的地步。

+0

僅僅因爲執行的「股」是異步並不意味着你應該難以追蹤其「前期歷史」,即在被調用點之前發生的事情的快照。通過Ajax調用,您可以(例如)將導致Ajax調用的堆棧跟蹤字符串附加到包裝Ajax對象的Promise。用MutationObserver這看起來不可能。煩人。 – 2017-08-30 18:54:36

9

我知道這個線程很舊,但是現在有一個Chrome的工具來跟蹤異步調用,我想提一下。

Chrome調用堆棧異步選項,我認爲這將實現異步調用的跟蹤。該選項可以在Developer tools - > Call stack選項卡中找到。通過打開Async選項並在MutationObserver回調函數上放置斷點,我們將能夠看到完整的調用堆棧。

希望它有幫助。

+0

國際海事組織,這是比最好的答案更好的答案。 – candrews 2016-05-23 17:03:09

+0

哎呀! Chrome DevTools現在缺少此「異步」複選框(v 60.0 ...)。也許它已經去了別的地方?任何這樣的FF?我討厭Chrome。 – 2017-08-30 18:51:02

相關問題