Einige der zusätzlichen Knoten Container sind, so dass man tiefer graben sollten:
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 Rückruf als Mikrotaskanalysierer blockiert DOM und JS-Engine ausgeführt wird, so Es sollte extrem schnell sein, vor allem auf einer komplexen Website wie Facebook, die viele DOM-Mutationen generiert.
Dies kann in Devtools (F12 Schlüssel) Profiler/Timeline Panels getestet werden.
Wenn Sie Nebenwirkungen bei der Verwendung eines MutationObserver minimieren wollen, verschieben große Chargen von Änderungen in Aufgabe nächste Veranstaltung:
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});
};
Does not 'childList' Hinzufügen und' subtree' zu den Beobachtungsparameter tiefer graben automatisch ? – Cliff
Es erweitert nicht * was hinzugefügt wurde. Zum Beispiel wird 'someNode.appendChild (anotherNodeWith1000children)' nicht erweitert, weil es nur eine Operation ist. – wOxxOm
Huh, ich dachte, so würde 'childList' funktionieren, und dann würde 'subtree' automatisch alle Nachkommen durchsuchen. Was macht eigentlich "subtree"? – Cliff