【发布时间】:2019-07-20 05:29:17
【问题描述】:
我有一个 MutationObserver 对象,该对象在函数内使用其回调函数进行初始化,并观察一个节点,该节点的其中一个子文本每两秒更改一次,以便将另一个节点的文本更改为始终与另一种带有回调函数。
在同一个函数中,我检查对象的属性是否与函数的参数相同。如果是,则初始化 MutationObserver 对象,如果不是,则在 try catch 中断开 MutationObserver 对象。
但是即使 MutationObserver 对象看似成功断开连接,它仍然会执行其回调函数并更改同一节点的文本,即使它已断开连接。
我尝试在函数外部声明观察者变量,但它仍然不起作用。 这是我的代码一般如何工作的示例:
var observer;
var objectList = [{
id: 1,
text: "ObjectA",
},
{
id: 2,
text: "ObjectB",
},
{
id: 3,
text: "ObjectC",
}
]
function changeText(id) {
var i, callback, config;
for (i = 0; i < objectList.length; i++) {
if (objectList[i].id === id) {
config = {
characterData: true
};
callback = function () {
document.getElementById("textNode").innerHTML = document.getElementById("otherTextNode").innerHTML;
};
observer = new MutationObserver(callback);
observer.observe(document.getElementById("otherTextNode"), config)
return;
}
}
document.getElementById("textNode").innerHTML = "";
try {
observer.disconnect();
} catch (e) {
document.getElementById("textNode").innerHTML = e.message;
}
}
因此,当使用对象的 id 属性之一作为参数调用函数 changeText() 时,MutationObserver 被初始化并开始观察,但是当参数与 id 不匹配时,MutationObserver 应该停止,但在我的情况下它继续运行,显示的消息是“观察者未定义”,即使在它被定义为 MutationObserver 并且它继续观察之后。
【问题讨论】:
-
因为您没有为您创建的每个观察者实例调用
observer.disconnect();? -
你可以尝试在它的回调函数中断开观察者的连接:stackoverflow.com/questions/41323897/…
-
谢谢它的工作,但是当我尝试它时出现了一个新问题......我忘了提到虽然“otherTextNode”出现在网页上,但“textNode”只出现在引导模式上,我需要“textNode”在模态仍然存在时继续更改,但是当观察者在其回调函数内断开连接时,“textNode”仅在我需要它继续更改时更改一次。
-
好的,我的问题在下面的答案中得到了解决。
标签: javascript