2

我目前正在学习 Javascript,其中一章是“Mutation Observer”。我正在尝试创建一个简单的函数来检测是否将新 div 添加到页面并将其显示在控制台中。但是,我收到了这条消息,我很难找到解决这个错误的解决方案。如果有人能向我解释我做错了什么,我将不胜感激。先感谢您!

未捕获的 TypeError:无法在“MutationObserver”上执行“观察”:参数 1 不是“节点”类型。

到目前为止,这是我写的代码:

document.getElementById("Button").onclick = function(){
  var Add = document.createElement('div');
    Add.setAttribute("class", "Alpha");
    Add.appendChild(document.createTextNode("Test"));
    document.getElementById('Frame').appendChild(Add);
};

var Divs = document.querySelectorAll("div");
var Observer = new MutationObserver(function(mutations){
  mutations.forEach(function(mutation){
    for(var i = 0; i <= mutation.addedNodes.length; i++){
      if(!(mutation.addedNodes[i] == null)){
        console.log(mutation.addedNodes[i].innerHTML);
      }
    }
  });
});
Observer.observe(Divs, {childList: true, subtree:true});
.Alpha{
  color:red;
}
<button id="Button">Generate a new div</button>
<div id="Frame"></div>

4

1 回答 1

3

错误消息中解释了该问题。该observe函数需要一个节点,但您正在分配querySelectorAll查找的返回值,该值实际上返回一个节点列表(所以一个或多个节点)。即使它什么也没找到,它也会返回一个空的NodeList并且仍然是无效的。

在您的实例中,您似乎正在将项目推入一个 id 为的 DIV,Frame因此我们将附加MutationObserver到该 DIV 上并观察其子项的任何更改。最后,我们会将任何更改的节点推送到一个数组中并在控制台记录内容,以便您查看它正在捕获的内容,

var target = document.getElementById('Frame');
var insertedNodes = [];
var Observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        for(var i = 0; i < mutation.addedNodes.length; i++) {
            insertedNodes.push(mutation.addedNodes[i]);
        }
    });
});

Observer.observe(target, {
    childList: true,
    subtree:true
});

console.log(insertedNodes);
于 2017-07-06T09:43:43.167 回答