MutationObserver回调不会触发EMBED节点

时间:2015-10-18 20:01:17

标签: javascript opera mutation-observers

出于某种原因,以下代码段只记录" false" 1000次以上,但从未"真实"。我无法弄清楚原因,因为它似乎适用于任何其他元素。

// 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视频,但在其他浏览器中它可能是视频。)

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:0)

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