我想知道何时或是否需要断开内容脚本中的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
已更改),因此上面的代码实际上是安全的,没有任何可能的内存泄漏。