8

Von http://updates.html5rocks.com/2012/02/Detect-DOM-changes-with-Mutation-Observers habe ich den folgenden Code:Warum wird der MutationObserver-Code nicht in Chrome 30 ausgeführt?

var insertedNodes = []; 
var observer = new WebKitMutationObserver(function(mutations) { 
alert('run'); 
mutations.forEach(function(mutation) { 
    for (var i = 0; i < mutation.addedNodes.length; i++) 
    insertedNodes.push(mutation.addedNodes[i]); 
}) 
}); 
observer.observe(document, { childList: true }); 
console.log(insertedNodes); 

var divElement = document.createElement('div'); 
divElement.innerHTML = 'div element'; 
document.querySelector('body').appendChild(divElement); 

jsFiddle: http://jsfiddle.net/cUNH9

Wie Sie sehen können, haben wir eine Benachrichtigung, weil ein div Element auf das DOM sehen sollte eingeführt wird. Aber es scheint, MutationObserver-Codes laufen nicht. Wie kann ich den MutationObserver-Code erfolgreich ausführen lassen?

+2

Ja, Wenn Sie document.body beobachten, wird es funktionieren. – PSL

+0

@plalx Ich habe sowohl 'neuen MutationObserver' als auch' neuen WebKitMutationObserver' ausprobiert. Sie teilen das gleiche Ergebnis. – weilou

+0

@weilou, Verwenden Sie nicht 'document.querySelector ('body')', verwenden Sie einfach 'document.body'. – plalx

Antwort

12

Hinzufügen subTree Option auch, es sollte funktionieren, möchten Sie nicht nur Kinder des Dokuments (head/body) zu überwachen, aber es ist auch Nachkommen. (Und das ist der Grund, wenn document.body es funktioniert).

observer.observe(document, { 
    attributes: true, 
    childList: true, 
    characterData: true, 
    subtree:true 
}); 

Fiddle

Von documentation

Teilbaum: Wird auf true gesetzt, wenn Mutationen zielen nicht nur auf, sondern auch Nachkommen des Ziels sind einzuhalten.

Also was Sie hinzufügen, ist ein Nachkomme des document nicht sein Kind (oder direkter Nachkomme). Es ist ein Kind von body (und deshalb nur erwähnt childList und document.body funktioniert). Sie müssen subTree erwähnen, wenn Sie die Änderungen tief überwachen möchten.

Siehe auch die Notiz auch:

HINWEIS: Am allerwenigsten, childlist, Attribute oder Character muss auf true gesetzt werden. Andernfalls wird der Fehler "Eine ungültige oder ungültige Zeichenfolge wurde angegeben" ausgegeben.

+2

@plalax Nein. Subtree ist erforderlich, wenn er auch tief im Körper überwachen will, zB wenn er ein anderes Div innerhalb dieses Div hinzufügen möchte. – PSL

+1

@plalx Überprüfen Sie dieses Beispiel, entfernen Sie Teilbaum und versuchen Sie es ebenfalls. http://jsfiddle.net/9wtDc/ – PSL

+0

Endlich habe ich 'subtree' hinzugefügt. Und es funktioniert jetzt. Danke Jungs. – weilou