为啥 MutationObserver 代码不能在 Chrome 30 上运行?

Posted

技术标签:

【中文标题】为啥 MutationObserver 代码不能在 Chrome 30 上运行?【英文标题】:Why doesn't MutationObserver code run on Chrome 30?为什么 MutationObserver 代码不能在 Chrome 30 上运行? 【发布时间】:2013-10-09 15:15:03 【问题描述】:

来自http://updates.html5rocks.com/2012/02/Detect-DOM-changes-with-Mutation-Observers我得到以下代码:

var insertedNodes = [];
var observer = new WebKitMutationObserver(function(mutations) 
 alert('run');
 mutations.forEach(function(mutation) 
   for (var i = 0; i < mutation.addedNodes.length; i++)
     insertedNodes.push(mutation.addedNodes[i]);
 )
);
observer.observe(document,  childList: true );
console.log(insertedNodes);

var divElement = document.createElement('div');
divElement.innerHTML = 'div element';
document.querySelector('body').appendChild(divElement);

jsFiddle:http://jsfiddle.net/cUNH9

如您所见,我们应该看到一个警报,因为 div 元素被插入到 DOM 中。但似乎 MutationObserver 代码没有运行。如何成功运行 MutationObserver 代码?

【问题讨论】:

是的,如果你观察 document.body 它将起作用.. @plalx 我尝试了new MutationObservernew WebKitMutationObserver。他们分享相同的结果。 @weilou,不要用document.querySelector('body'),只用document.body @weilou 查看我的答案...它也适用于文档。 【参考方案1】:

也添加subTree 选项,它应该可以工作,您不仅要监视文档的子项(head/body),还要监视其后代。 (这就是设置为document.body 的原因)。

observer.observe(document, 
    attributes: true,
    childList: true,
    characterData: true,
    subtree:true
);

Fiddle

来自documentation

subtree:如果不仅要观察目标的突变,还要观察目标的后代,则设置为 true。

所以你添加的是document 的后代,而不是它的孩子(或直接后代)。它是body 的孩子(这就是为什么只提到childList 并使用document.body 有效)。如果您想深入监控更改,则需要提及subTree

另见注释:

注意:至少,childList、attributes 或 characterData 必须设置为 true。否则,会抛出“指定了无效或非法的字符串”错误。

【讨论】:

@plalx 否。如果他想在 body 深处也监控,则需要子树,例如,如果他想在这个 div 中添加另一个 div。 @plalx 检查此示例删除子树并尝试。 jsfiddle.net/9wtDc @PSL,对,我的错;) @PSL 它在 Firefox 中不起作用。有其他选择吗? @PS 我发现了这个问题。我不应该在 Firefox 中监视 document.body,因为 DOM 还没有准备好。 (即它是空的)在页面加载期间。相反,在正文中创建一个主 div 并观察它。我想知道为什么 Firefox 的行为与 Chrome 和 IE 不同。

以上是关于为啥 MutationObserver 代码不能在 Chrome 30 上运行?的主要内容,如果未能解决你的问题,请参考以下文章

MutationObserver 点击元素/类

IE 11 上的 MutationObserver 语法错误

如何在多个节点上使用 MutationObserver?

如何在 MutationObserver 的回调中“暂停”观察

MutationObserver:忽略一个 DOM 动作

JavaScript是如何工作的:使用MutationObserver跟踪DOM的变化