MutationObserver 回调不会为 EMBED 节点触发

MutationObserver callback doesn't fire for EMBED nodes

出于某种原因,以下代码片段仅记录 "false" 1000 多次,但从未记录 "true"。我不明白为什么,因为它似乎适用于任何其他元素。

// create an observer instance
// log whether the mutation is made to an EMBED node
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.dir(mutation.target.nodeName == 'EMBED');
  });
});

// configuration of the observer:
var config = {
  attributes: true, // required
  childList: true, // required
  characterData: true, // required
  subtree: true // get updates from the descendants, not just the children
};

// start observing immediately
// this works because "document" always exists
observer.observe(document, config);

我正在最新的 Opera 中测试此页面上的代码:

https://www.facebook.com/ccstandup/videos/vb.331786510170444/1177307595618327/

(如果你用的是最新的Opera,应该是用EMBED实现的Flash视频,其他浏览器可能是VIDEO)

知道我做错了什么吗?

target 是发生了变化的元素。当一个元素被插入时,改变的不是那个元素,而是它的父元素。检查 mutation.target.nodeName == 'EMBED' 将检查嵌入元素的 attributeschildListcharacterData 是否已更改,但它们没有更改。如果您需要查看 embed 元素本身何时被插入,则需要从父元素的角度来看它,例如

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    if (mutation.type !== 'childList') return;

    mutations.addedNodes.forEach(function(node){
      if (node.nodeType !== Node.ELEMENT_NODE) return;

      var embed = node.tagName.toLowerCase() === 'embed' ? node :
          node.querySelector('embed');

      // Found an embed element.
      if (embed) console.log(embed);
    });
    console.dir(mutation.target.nodeName == 'EMBED');
  });
});