何时断开Chrome / Web Extension中的MutationObserver?



我想知道何时或是否需要断开内容脚本中的MutationObserver以避免内存泄漏。

因此,我的内容脚本会检查DOM中的所有新添加内容并相应地更新 HTML。我为此使用了一个MutationObserver,它是在内容脚本中创建和启动的。

我的问题是,MutationObserver在加载新页面时会自行销毁,还是必须收听页面更改以断开连接并每次自己销毁它。

以下是相关代码:

function startObserver(textSize: number, lineHeight: number, font: string = "Droid Arabic Naskh") {
let config: MutationObserverInit = {
attributes: false,
childList: true,
subtree: true,
characterData: true,
characterDataOldValue: false,
};
let callback: MutationCallback = (mutationsList: MutationRecord[]) => {
mutationsList.forEach((record: MutationRecord) => {
// If something has been added
if (record.addedNodes.length > 0) {
//  For each added node
record.addedNodes.forEach((addedNode: Node) => {
// For each node with Arabic script in addedNode
getArabicTextNodesIn(addedNode).forEach((arabicNode: Node) => {
// Update arabicNode only if it hasn't been updated
if (arabicNode.parentElement && arabicNode.parentElement.getAttribute("class") != "ar") {
updateNode(arabicNode, textSize, lineHeight, font);
}
});
});
}
});
};
if (!observer) {
observer = new MutationObserver(callback);
observer.observe(document.body, config);
}
}

由于@xOxxm和一些个人测试和玩耍,很久以前就发现了它,但回答自己以防将来其他人需要这个

加载新页面时,MutationObserver是否会自行销毁,或者我必须收听页面更改以断开连接并每次自己销毁它?

是的,MutationObserver在离开页面时会自行销毁(document已更改),因此上面的代码实际上是安全的,没有任何可能的内存泄漏。

最新更新