- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
a.klass")).forEac-6ren">
Benchmark比较 QSA & .forEach
对比 NodeIterator
toArray(document.querySelectorAll("div > a.klass")).forEach(function (node) {
// do something with node
});
var filter = {
acceptNode: function (node) {
var condition = node.parentNode.tagName === "DIV" &&
node.classList.contains("klass") &&
node.tagName === "A";
return condition ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT
}
}
// FIREFOX Y U SUCK
var iter = document.createNodeIterator(document, NodeFilter.SHOW_ELEMENT, filter, false);
var node;
while (node = iter.nextNode()) {
// do thing with node
}
NodeIterator
很糟糕,或者我做错了。
NodeIterator
?
最佳答案
NodeIterator
(和 TreeWalker
,就此而言)由于各种原因几乎从未使用过。这意味着有关该主题的信息很少,并且 answers like @gsnedders'来,这完全不合时宜。我知道这个问题已经有将近十年的历史了,所以请原谅我的死灵术。
1. 启动与表现
确实,启动的 NodeIterator
比 querySelectorAll
之类的方法慢,但这不是您应该衡量的性能。
关于NodeIterator
的事情s 是他们以这种方式生活,就像 HTMLCollection
或直播 NodeList
,您可以在启动一次后继续使用该对象。NodeList
返回者 querySelectorAll
是静态的,每次需要匹配新添加的元素时都必须重新启动。
This version jsPerf 的 NodeIterator
在准备代码中。实际测试仅尝试使用 iter.nextNode()
遍历所有新添加的元素。 .您可以看到迭代器现在快了几个数量级。
2. 选择器性能
好吧,爽。缓存迭代器更快。 This version然而,显示了另一个显着差异。我添加了 10 个选择器不应该匹配的类( done[0-9]
)。迭代器丢失了大约 10% 它的速度,而 querySelectors 失去了 20% .
另一方面,this version , 显示添加另一个 div >
时发生的情况在选择器的开头。迭代器丢失 33% 它的速度,而 querySelectors 的速度是 增加的 10% .
删除初始 div >
在选择器的开头,如 this version表明这两种方法都变慢了,因为它们比早期版本匹配得更多。与预期的一样,在这种情况下,迭代器的性能相对比 querySelectors 更高。
这意味着在 NodeIterator
中基于节点自己的属性(它的类、属性等)进行过滤可能会更快。 ,虽然在选择器中有很多组合符(>、+、~ 等)可能意味着 querySelectorAll
速度更快。对于 尤其如此。 (空间)组合器。使用
querySelectorAll('article a')
选择元素比手动循环遍历每个 a
的所有父级要容易得多元素,寻找具有 tagName
的元素的 'ARTICLE'
.
附言在第 3.2 节中,我举了一个例子,说明如果您想要与空间组合器所做的相反的事情(排除带有 a
祖先的 article
标签),完全相反的情况如何成立。
3 不可能的选择器
3.1 简单的层次关系
当然,手动过滤元素为您提供了几乎无限的控制。这意味着您可以过滤掉通常无法与 CSS 选择器匹配的元素。例如,CSS 选择器只能以选择 div
的方式“回顾”。 s 前面是另一个 div
可以使用 div + div
.选择 div
s 后跟另一个 div
是不可能的。
然而,在 NodeFilter
里面,您可以通过检查 node.nextElementSibling.tagName === 'DIV'
来实现此目的.对于 CSS 选择器无法做出的每个选择,也是如此。
3.2 更全局的层级关系
我个人喜欢的另一件事 NodeIterator
s,是您可以通过返回 NodeFilter.FILTER_REJECT
来拒绝一个节点及其整个子树。而不是 NodeFilter.FILTER_SKIP
.
想象一下你想遍历所有 a
页面上的标签,带有 article
的标签除外祖先。使用 querySelectors,您可以输入类似的内容
let a = document.querySelectorAll('a')
a = Array.prototype.filter.call(a, function (node) {
while (node = node.parentElement) if (node.tagName === 'ARTICLE') return false
return true
})
NodeFilter
,你只需要输入这个
return node.tagName === 'ARTICLE' ? NodeFilter.FILTER_REJECT : // ✨ Magic happens here ✨
node.tagName === 'A' ? NodeFilter.FILTER_ACCEPT :
NodeFilter.FILTER_SKIP
NodeIterator
有。
NodeIterator
必须提供:
NodeFilter.FILTER_REJECT
示例的用处都不为过) NodeIterator
s 当以下任一情况为真时:
body.mobile article > div > div a[href^="/"]
)关于javascript - 何时使用 NodeIterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7941288/
Benchmark比较 QSA & .forEach对比 NodeIterator toArray(document.querySelectorAll("div > a.klass")).forEac
如何使用 org.w3c.dom.traversal.NodeIterator 使用 Xpath 迭代 Java 中的节点 我有以下代码,但不起作用。 import org.w3c.dom.t
我正在使用 Java 并尝试解析 XML 文档。我有一个文档,其中有两个同级标签,它们具有相同的元素名称,如下所示: ... ...
当迭代 DOM 元素或查找一组 DOM 元素时,使用哪个更好。 Xpath 更快吗? 最佳答案 如果您想查找一组处于不同层次级别和不同感兴趣属性的元素,那么您应该使用 Xpath。 如果您只想在一组元
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭2年前。 Improve this que
我是一名优秀的程序员,十分优秀!