8

От http://updates.html5rocks.com/2012/02/Detect-DOM-changes-with-Mutation-Observers я получил следующий код:Почему в Chrome 30 не работает код 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

Как вы можете видеть, мы должны увидеть предупреждение, потому что div элемент вставляется в DOM. Но, похоже, коды MutationObserver не запускаются. Как я могу успешно запустить код MutationObserver?

+2

Да, если вы заметили document.body, это сработает. – PSL

+0

@plalx Я попробовал как новый MutationObserver, так и новый WebKitMutationObserver. Они имеют одинаковый результат. – weilou

+0

@weilou, Не используйте 'document.querySelector ('body')', просто используйте 'document.body'. – plalx

ответ

12

Добавить subTree вариант, он должен работать, вы хотите контролировать не только детей документа (head/body), но и потомков. (И в этом причина, когда установлено значение document.body, он работает).

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

Fiddle

От documentation

поддерево: Установите верно, если мутации не только цели, но и цели на потомков должны быть соблюдены.

Так что вы добавляете потомок document, а не его ребенка (или прямого потомка). Это ребенок body (и именно поэтому просто упоминается childList и с использованием document.body работ). Вы должны указать subTree, если вы хотите глубоко контролировать изменения.

Также см примечание, а:

Примечание: По крайней мере, childList, атрибуты, или CharacterData должен быть установлен верно. В противном случае указана «Неверная или незаконная строка».

+2

@plalx Нет. Subtree требуется, если он хочет также следить за телом в теле, например, если он хочет добавить anothe div внутри этого div. – PSL

+1

@plalx проверьте этот пример, удалите поддерево и попробуйте. http://jsfiddle.net/9wtDc/ – PSL

+0

Наконец, я добавил 'поддерево'. И это работает сейчас. Спасибо вам, ребята. – weilou