使用querySelectorAll时,可以在示例文档中找到138个td节点。

Array.from(document.querySelectorAll('td')).length
138


当我对XPath进行相同操作时,没有任何结果:

Array.from(document.evaluate(".//td", document.body, null, XPathResult.ANY_TYPE, null)).length
0


尽管至少有一场比赛:

document.evaluate(".//td", document.body, null, XPathResult.ANY_TYPE, null).iterateNext().nodeName
"TD"


问题似乎是Array.from无法遍历XPathResult。即使返回0:

Array.from(document.evaluate('.', document.body, null, XPathResult.ANY_TYPE, null)).length
0


如何使XPathResult适合Array.from

最佳答案

不幸的是你不能。 Array.from可以将两种类型的对象转换为数组:


那些具有.length属性的“类似数组”的数组。
那些实现迭代器协议并允许您获取其所有元素的控件。


XPathResult不执行任何这些操作。您可以通过手动遍历结果并将结果存储在数组中来实现此目的,例如:

const nodes = [];
let node = xPathResult.iterateNext();
while (node) {
  nodes.push(node);
  node = xPathResult.iterateNext();
}


...但是如果您仍然要遍历节点,则可能可以执行您想在循环中执行的任何数组操作。

09-11 19:20