Чтобы поддерживать правильное и высокочувствительное наложение графического интерфейса на каждом веб-сайте, мне необходимо как можно скорее зарегистрировать и проанализировать все соответствующие элементы DOM. В настоящее время я использую MutationObserver, который делает эту работу для меня и упрощены, это выглядит следующим образом:Javascript: Регистрация * каждый * элемент DOM при создании/добавлении к DOM
var observer = new MutationObserver(
function(mutations){
mutations.forEach(
function(mutation){
if(mutation.type == 'childList')
{
var nodes = mutation.addedNodes;
var n = nodes.length;
for(var i = 0; i < n; i++)
{
if(nodes[i].nodeType == 1) // ELEMENT_NODE
{
// Save it in specific Array or something like this
AnalyzeNode(nodes[i]);
}
}
}
}
);
}
);
var config = {subtree: true, childList: true};
observer.observe(document, config);
Но я пришел к осознанию того, что используется MutationObserver не вызывая AnalyzeNode для каждый узел, содержащийся в DOM. Когда уже завершенное (вспомогательное) дерево создается вне DOM (например, путем выполнения внешнего скрипта JS при загрузке страницы), и вы добавляете его корень в DOM mutation.addedNodes будет содержать только корень поддерева и все его дочерние элементы будет оставаться незамеченным (потому что никаких дальнейших мутаций там не будет), будучи частью DOM, но не анализировалось.
У меня была идея проверки, если добавляется узел может уже иметь ChildNodes, чтобы определить его как корень литерой поддерева, но, к сожалению, кажется, что каждый addedNode может иметь детей в данный момент называются функции в MutationObserver в , Таким образом, на этом пути невозможно провести различие.
Я действительно не хочу дважды проверять каждый дочерний узел добавленного узла (родительского узла), пока его родительский узел обрабатывается MutationObserver. В большинстве случаев дочерний узел будет обрабатываться MutationObserver, когда он будет частью добавленNodes в другую возникающую мутацию, и накладные расходы, по-видимому, становятся ненужными.
Кроме того, я думал о наборе узлов, чьи дети должны анализироваться вне вызова MutationObserver. Если добавленный узел имеет дочерние элементы при добавлении к DOM, узел добавляется в Set. Когда другая мутация происходит и один из его детей является частью addedNodes, его ребенок удаляет его родителя из набора с помощью mutation.target - что родительский узел (mutation.type должен быть childList). Проблема с этим подходом - это время, когда нужно проверять дочерние узлы в Set (и тот факт, что я мог запросить document.getElementsByTagname для каждого соответствующего типа элемента вместо сохранения набора, но проблема синхронизации все еще существует). Имейте в виду, что это должно быть как можно скорее, чтобы накладывать отзывчивость и установку на веб-сайт. Сочетание документа «ы onreadystatechange и добавления новых сценария узлов в DOM (в качестве индикатора, когда внешний код JS выполняется), может работать даже для сайтов, воссоздавая части его содержания (я смотрю на вас DuckDuckGo страница результатов поиска). Но это похоже на обходное решение, которое не решит проблему в 100% случаев.
Итак, есть ли другой, более эффективный способ? Или любой из этих подходов может быть достаточным, если его немного изменить? Большое спасибо!
(Пожалуйста, постарайтесь избежать JQuery, где это возможно, как пример кода, спасибо И, кстати, я использую CEF, поэтому в лучшем случае будет решение работать с Webkit/Blink.)
EDIT1: Отрисовка веб-сайта выполняется CEF и рендеринг GUI осуществляется C++/OpenGL с информацией, полученной указанным кодом Javascript.
Посмотрите на это: https://davidwalsh.name/detect-node-insertion - похоже, делает то, что вы хотите сделать, без обхода узла – eithed
Возможно, вы можете просто добавить глобальное правило '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', ' – wOxxOm
@eithedog Я видел это сообщение раньше, но я думаю, что было бы необходимо добавить слушателей к каждому добавленному узлу, поэтому снова: много дополнительных (а также нескольких) вызовов на узел. – dm102