Цель состоит в том, чтобы собрать все текстовые узлы, которые являются прямыми или косвенными предками элемента body, которые соответствуют определенным критериям.
Проблема заключается в том, что сбор узлов осуществляется методомnextNode
объекта NodeIterator
кажется очень медленным.
Я провел несколько тестов производительности, первая группа с NodeIterator
, которая принимает все текстовые узлы, во второй группе узлы принимаются, только если 3 критериявстречаются.
Первая группа примерно в 3 раза быстрее второй - но она все еще слишком медленная для моей цели.
const iterator = window.document.createNodeIterator(
document.body,
NodeFilter.SHOW_TEXT,
{
acceptNode(node) {
return (satisfies1(node) && satisfies2(node) && satisfies3(node))
}
},
false);
const matchingTextNodes = [];
let n;
while (n = iterator.nextNode()) matchingTextNodes.push(n);
Есть ли более быстрые альтернативы NodeIterators для этого сценария?
Меня интересуют только текстовые узлы.
Обновление: Ручной обход DOM кажется немного быстрее, но все же не является достаточным улучшением:
const matchingTextNodes = [];
function collect(el) {
const children = el.childNodes;
let c = children.length, child;
for (let i = 0; i < c; i++) {
child = children[i];
if (satisfies1(child) && satisfies2(child) && satisfies3(child)) {
matchingTextNodes.push(child);
} else {
collect(child);
}
}
}
collect(document.body);