何时断开 Chrome/Web Extension 中的 MutationObserver?
When to disconnect MutationObserver in Chrome / Web Extension?
我想知道何时或是否需要断开内容脚本中的 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 和一些个人测试和玩弄,但我自己回答以防将来其他人需要它
Does the MutationObserver
destroy itself when a new page is loaded or must I listen to page changes to disconnect it and destroy it myself each time?
是的,MutationObserver
在离开页面时自行销毁(document
已更改),所以上面的代码实际上是安全的,没有任何可能的内存泄漏。
我想知道何时或是否需要断开内容脚本中的 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 和一些个人测试和玩弄,但我自己回答以防将来其他人需要它
Does the
MutationObserver
destroy itself when a new page is loaded or must I listen to page changes to disconnect it and destroy it myself each time?
是的,MutationObserver
在离开页面时自行销毁(document
已更改),所以上面的代码实际上是安全的,没有任何可能的内存泄漏。