8

Od http://updates.html5rocks.com/2012/02/Detect-DOM-changes-with-Mutation-Observers mam następujący kod:Dlaczego w przeglądarce Chrome 30 nie działa kod MutationObserver?

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

Jak widać, powinniśmy zobaczyć alert ponieważ element div jest włożona do DOM. Ale wygląda na to, że kody MutationObserver nie działają. Jak mogę uruchomić kod MutationObserver?

+2

Tak, jeśli zaobserwujesz document.body to zadziała .. – PSL

+0

@plalx Próbowałem obu 'new MutationObserver' oraz' new WebKitMutationObserver'. Mają ten sam wynik. – weilou

+0

@weilou, Nie używaj 'document.querySelector ('body')', użyj po prostu 'document.body'. – plalx

Odpowiedz

12

Dodaj również opcję subTree, powinna działać, chcesz monitorować nie tylko dzieci dokumentu (head/body), ale to także potomkowie. (I dlatego jest ustawiony na document.body to działa).

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

Fiddle

Od documentation

subtree: Ustaw na true jeśli mutacje nie tylko cel, ale także docelowego potomków mają być przestrzegane.

Więc to, co dodajesz, jest potomkiem document, a nie jego dzieckiem (lub bezpośrednim potomkiem). Jest to dziecko z body (i dlatego właśnie wspominając o childList i przy użyciu prac document.body). Musisz wspomnieć o subTree, jeśli chcesz monitorować głębokie zmiany.

Patrz także uwaga, a także:

UWAGA: Przynajmniej, liścieelementów podrzędnych, atrybutów lub characterData musi być ustawiona na true. W przeciwnym razie "Podano nieprawidłowy lub niedozwolony ciąg" zostanie zgłoszony błąd.

+2

@plalx Nie. Subtree jest wymagane, jeśli chce monitorować również głębokie ciało, ex, jeśli chce dodać anothe div wewnątrz tego div. – PSL

+1

@plalx sprawdź ten przykład usuń poddrzewo i spróbuj również. http://jsfiddle.net/9wtDc/ – PSL

+0

W końcu dodałem 'subtree'. I teraz działa. Dzięki chłopaki. – weilou

Powiązane problemy