Mutation Observer не обнаруживает узлы, добавленные через innerHTML, appendChild

Когда мы пытаемся добавить вложенные узлы в DOM, используя appendChild или innerHTML, вложенные узлы не входят в добавленные узлы мутации.

Начальная настройка HTML:

<html>
    <body>
        <div id="container">
        </div>
    </body>
</html>

Вот мой код наблюдателя мутации:

var observer = new MutationObserver(function(mutations) {
  for (var i = 0; i < mutations.length; i++) {
    var mutation = mutations[i];
    switch(mutation.type) {
      case 'childList':
        console.log(mutation.addedNodes);
      break;
      default:

    }
  }
});

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

Если я теперь делаю appendChild с вложенным узлом img в div,

var img = document.createElement('img');
img.setAttribute("src", "http://img.zohostatic.com/discussions/v1/images/defaultPhoto.png");
var div = document.createElement('div');
div.appendChild(img);
var container = document.getElementById("container");
container.appendChild(div);

Mutation Observer регистрирует только div, добавленный к контейнеру, но не регистрирует img как добавленный узел в мутации.

Вот рабочий JSFiddle: https://jsfiddle.net/aedhefhn/

Есть ли обходной путь для этого?

1 ответ

Решение

Это ожидаемое поведение. div было все, что было добавлено, просто у него было несколько детей. Конечно, вы можете пройти через его дочерние узлы самостоятельно .addedNodes хоть. .addedNodes это просто массив узлов, так что вы можете пройти через каждый элемент рекурсивно, чтобы получить все дочерние элементы.

Другие вопросы по тегам