が追加されたノードのいくつかは、コンテナである:ブロックDOMとJSエンジンという
var startObserver = function() {
var observer = new MutationObserver(function(mutations) {
for (var m=0; m < mutations.length; m++) {
var added = mutations[m].addedNodes;
for (var i = 0; i < added.length; i++) {
var node = added[i];
if (node.nodeType != 1) { // not Node.ELEMENT_NODE
continue;
}
if (/\buserContentWrapper\b/.test(node.className)) {
processFilter(node);
} else if (node.children.length) {
var nodes = node.getElementsByTagName('userContentWrapper');
for (var j = 0; j < nodes.length; j++) {
processFilter(nodes[j]);
}
}
}
});
});
observer.observe(document, {childList: true, subtree: true});
};
MutationObserverコールバックがマイクロタスクとして実行されるので、 が極端にである必要があります。特に、Facebookのような複雑なサイトでは、多くのDOM変異が生成されます。
これは、devtools(F12キー)プロファイラ/タイムラインパネルでテストできます。
あなたがMutationObserverを使用しての悪影響を最小限にしたい場合は、次のイベントに変化の大きなバッチを延期タスク:
var startObserver = function() {
var observer = new MutationObserver(function handler(mutations, postponed) {
if (mutations.length > 100 && !postponed) {
setTimeout(function() { handler(mutations, true) }, 0);
return;
}
for (var m=0; m < mutations.length; m++) {
var added = mutations[m].addedNodes;
for (var i = 0; i < added.length; i++) {
var node = added[i];
if (node.nodeType != 1) { // not Node.ELEMENT_NODE
continue;
}
if (/\buserContentWrapper\b/.test(node.className)) {
processFilter(node);
} else if (node.children.length) {
var nodes = node.getElementsByTagName('userContentWrapper');
for (var j = 0; j < nodes.length; j++) {
processFilter(nodes[j]);
}
}
}
});
});
observer.observe(document, {childList: true, subtree: true});
};
は、観測パラメータに 'childList'と' subtree'を追加しません深く自動的に掘ります? – Cliff
追加されたものを*展開しません。たとえば、 'someNode.appendChild(anotherNodeWith1000children)'は展開されません。 – wOxxOm
ええと、私はそれが 'childList'がどのように働いたのかと思っていましたし、' subtree'は自動的にすべての子孫を検索します。 'サブツリー'は実際に何をしていますか? – Cliff