2013-03-08 131 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