是否有比使用NodeIterator更快的收集所有文本节点的方法?

时间:2019-01-01 19:45:06

标签: javascript performance iterator dom-traversal textnode

目标是用于收集满足某些条件的,是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);

此szenario是否有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);

0 个答案:

没有答案