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