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'
将检查嵌入元素的 attributes
、childList
或 characterData
是否已更改,但它们没有更改。如果您需要查看 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');
});
});
出于某种原因,以下代码片段仅记录 "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'
将检查嵌入元素的 attributes
、childList
或 characterData
是否已更改,但它们没有更改。如果您需要查看 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');
});
});