MutationObservers - некоторые добавленные узлы не обнаружены

У меня есть контент-скрипт, который прослушивает вставку текстовых узлов на некоторых сайтах. Работает отлично, кроме как на Facebook. Некоторые из вставленных текстовых узлов не обнаруживаются скриптом.

script.js

var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        if (mutation.type  === "characterData") {
            console.log(mutation.target);
        } else {
            for (var x = 0; x < mutation.addedNodes.length; x++) {
                var node = mutation.addedNodes[x];
                if (node.nodeType === Node.TEXT_NODE) {
                    console.log(node);
                }
            }
        }
    });
});
observer.observe(document, { childList: true, subtree: true, characterData: true });

Если я разрешаю ведение журнала всех типов узлов, я могу видеть родительские узлы этих текстовых узлов в моем журнале.

Благодарю.

2 ответа

Вероятно, это та же проблема, что и этот вопрос . Если сценарий «строит» элементы вне DOM, а затем присоединяет корень, только корень будет указан как добавленный узел. TreeWalker может использоваться для обхода поддерева добавленного узла в поисках текста.

      for (const addedNode of mutation.addedNodes) {
    if (addedNode.nodeType === Node.TEXT_NODE) {
        console.log(addedNode);
    } else {
        // If added node is not a Text node, traverse subtree to find Text nodes
        const nodes = document.createTreeWalker(addedNode, NodeFilter.SHOW_TEXT);
        while (nodes.nextNode()) {
            console.log(nodes.currentNode);
        }
    }
}

У Facebook есть способ обнаружения, даже когда на сайте открыт отладчик. Я предполагаю, что у них также есть способ обнаружить наблюдателей мутаций. Они могут просто блокировать ваши скрипты контента. Кроме того, я бы не стал использовать весь документ в качестве своего объекта. Просто попробуйте контролировать то, что вы хотите, используя document.querySelector.

Другие вопросы по тегам