Существуют ли более быстрые способы сбора всех текстовых узлов, чем использование NodeIterator? - PullRequest
0 голосов
/ 01 января 2019

Цель состоит в том, чтобы собрать все текстовые узлы, которые являются прямыми или косвенными предками элемента 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);
...