MutationObserver 和 querySelectorAll
MutationObserver and querySelectorAll
我目前正在学习 Javascript,其中一章是 "Mutation Observer"。我正在尝试创建一个简单的函数来检测是否将新的 div 添加到页面并将其显示在控制台中。但是,我收到此消息,但我很难找到解决此错误的解决方案。如果有人能向我解释我做错了什么,我将不胜感激。提前致谢!
Uncaught TypeError: Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'.
到目前为止这是我写的代码:
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>
错误消息中解释了该问题。 observe
函数需要一个 Node but you're assigning the return value of querySelectorAll
lookup which actually returns a NodeList (所以一个或多个节点)。即使它什么也没找到,它也会 return 一个空的 NodeList
并且仍然无效。
在您的实例中,您似乎正在将项目推送到 ID 为 Frame
的 DIV 中,因此我们会将我们的 MutationObserver
附加到其中并观察任何更改它 children。最后,我们会将任何更改的节点推送到一个数组中,并在控制台记录内容,以便您可以看到它捕获的内容,
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);
我目前正在学习 Javascript,其中一章是 "Mutation Observer"。我正在尝试创建一个简单的函数来检测是否将新的 div 添加到页面并将其显示在控制台中。但是,我收到此消息,但我很难找到解决此错误的解决方案。如果有人能向我解释我做错了什么,我将不胜感激。提前致谢!
Uncaught TypeError: Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'.
到目前为止这是我写的代码:
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>
错误消息中解释了该问题。 observe
函数需要一个 Node but you're assigning the return value of querySelectorAll
lookup which actually returns a NodeList (所以一个或多个节点)。即使它什么也没找到,它也会 return 一个空的 NodeList
并且仍然无效。
在您的实例中,您似乎正在将项目推送到 ID 为 Frame
的 DIV 中,因此我们会将我们的 MutationObserver
附加到其中并观察任何更改它 children。最后,我们会将任何更改的节点推送到一个数组中,并在控制台记录内容,以便您可以看到它捕获的内容,
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);