何时断开 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 已更改),所以上面的代码实际上是安全的,没有任何可能的内存泄漏。