Javascript 删除元素后观察者行为的变化
我有一个Javascript 删除元素后观察者行为的变化,javascript,mutation-observers,Javascript,Mutation Observers,我有一个MutationObserver绑定到#foohtml元素 var target = document.querySelector("#foo"); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { // ... }); }); 当用户单击#按钮元素时,#foo将被删除,并在一秒钟后再次显示 <div id
MutationObserver
绑定到#foo
html元素
var target = document.querySelector("#foo");
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
// ...
});
});
当用户单击#按钮
元素时,#foo
将被删除,并在一秒钟后再次显示
<div id="button">Click me to remove the Foo!</div>
<div id="foo">Hello, I'm Foo!</div>
单击我删除Foo!
你好,我是福!
正如我所注意到的,在删除并重新创建了#foo
之后,观察者停止了工作
- 这是正常的行为吗
- 那么,我需要再次启动观察者
- 第一个观察者是否被完全移除?或者,与此相反,它仍然在运行,只是“什么也不做”?-我在问这个问题,因为我不想让多个观察者运行,如果他们中只有一个做真正的工作的话
var target=document.querySelector(“#foo”);
var观察者=新的突变观察者(功能(突变){
log(“#foo被修改”);
});
observer.observe(目标,{subTree:true,childList:true});
var计数器=0;
勾选();
setTimeout(函数(){
log(“用新的替换foo”);
target.parentNode.removeChild(目标);
target=document.createElement(“div”);
target.id=“foo”;
target.innerHTML=“这是新的foo”;
document.body.insertBefore(目标、document.body.firstChild);
}, 1000);
函数tick(){
target.appendChild(document.createTextNode(“.”);
如果(++计数器<20){
设置超时(勾选200);
}
}
这是原始的foo
什么意思“…一秒钟后再次出现…”?具有相同ID的新元素?或者你把同样的元素放回去了?更多的读者请看T.J.Crowder帖子的评论。你能把第二点和第三点的答案扩展一下吗?:-)@约翰1212:也许你可以回答我问你的问题。哦,对不起,我明白了,但是忘了写信。目前,我不知道实际发生了什么,因为我正在为一个相当复杂的页面编写一个用户脚本,这是web应用程序的一部分。然而,我认为,#foo
是一个新元素。所以,根据你的说法,现有的行为是正常的。只是偶然发现了这个问题。根据规范,在中,节点在其观察者上具有强引用,而观察者在其观察的节点上仅具有弱引用。因此,如果没有对观察者的引用,移除节点最终应该移除观察者。