--- title: Document.evaluate() slug: Web/API/Document/evaluate tags: - API - DOM - XPath - 参考 - 方法 translation_of: Web/API/Document/evaluate ---
根据传入的 XPath 表达式以及其他参数,返回一个 {{domxref("XPathResult")}} 对象。
var xpathResult = document.evaluate( xpathExpression, contextNode, namespaceResolver, resultType, result );
xpathExpression 表示要计算的 Xpath 字符串。contextNode 表示本次查询的上下文节点(参照XPath规范 http://www.w3.org/TR/xpath)。通常会使用 document。namespaceResolver 是函数。传入名空间前缀,返回跟此前缀相关的名空间URI(字符串)。通常用来解析Xpath内的前缀,以便对文档进行匹配。HTML文档或者不使用名空间前缀的文档,通常传入 null。resultType 是整数。指定所返回的 XPathResult 的类型,常使用 named constant properties,如 XPathResult.ANY_TYPE,范围 0 到 9,见下表。result 为 XPathResult 型,用以存储查询结果。通常传入 null,此时将创建新的 XPathResult 对象。var headings = document.evaluate("/html/body//h2", document, null, XPathResult.ANY_TYPE, null);
/* 在 document 中查找所有的 h2 元素。
* 结果可能是无序节点迭代器。 */
var thisHeading = headings.iterateNext();
var alertText = "Level 2 headings in this document are:\n";
while (thisHeading) {
alertText += thisHeading.textContent + "\n";
thisHeading = headings.iterateNext();
}
alert(alertText); // 显示所有 h2 节点的文本
注意,在上述例子中,最好写更冗长的XPath,而不是常用的简写,比如 //h2。 通常,像上述例子所示,更具体的XPath选择器会得到显著的性能提升,特别是在非常大的文档中。这是因为查询计算不会将时间浪费在查看不需要的节点上。使用 // 通常很慢,这是因为它要从根节点和所有子节点中查找所有可能匹配的节点。
通过谨慎使用上下文参数能得到进一步的优化。比如,如果你知道你要查找的内容在 body 标签的某处,你可以这样做:
document.evaluate(".//h2", document.body, null, XPathResult.ANY_TYPE, null);
注意上面的 document.body 已经替代了document作为上下文,所以 XPath 从 body 元素开始查找。 (在这个例子中,"." 很重要,因为它指示了查找要从document.body这个上下文节点开始。如果遗漏了 "." (剩下 //h2) ,查找会从根节点(html)处开始,这样会很浪费。)
查阅 Introduction to using XPath in JavaScript 获得更多信息。
someXMLDoc.evaluate() ,虽然在 FF2 上 document.evaluate() 也有效。(Merge with Template:XPathResultConstants?
这些是 evaluate 方法的 resultType 参数支持的值:
| Result Type | Value | Description |
ANY_TYPE |
0 | Whatever type naturally results from the given expression. |
NUMBER_TYPE |
1 | A result set containing a single number. Useful, for example, in an XPath expression using the count() function. |
STRING_TYPE |
2 | A result set containing a single string. |
BOOLEAN_TYPE |
3 | A result set containing a single boolean value. Useful, for example, an an XPath expression using the not() function. |
UNORDERED_NODE_ITERATOR_TYPE |
4 | A result set containing all the nodes matching the expression. The nodes in the result set are not necessarily in the same order they appear in the document. |
ORDERED_NODE_ITERATOR_TYPE |
5 | A result set containing all the nodes matching the expression. The nodes in the result set are in the same order they appear in the document. |
UNORDERED_NODE_SNAPSHOT_TYPE |
6 | A result set containing snapshots of all the nodes matching the expression. The nodes in the result set are not necessarily in the same order they appear in the document. |
ORDERED_NODE_SNAPSHOT_TYPE |
7 | A result set containing snapshots of all the nodes matching the expression. The nodes in the result set are in the same order they appear in the document. |
ANY_UNORDERED_NODE_TYPE |
8 | A result set containing any single node that matches the expression. The node is not necessarily the first node in the document that matches the expression. |
FIRST_ORDERED_NODE_TYPE |
9 | A result set containing the first node in the document that matches the expression. |
Results of NODE_ITERATOR types contain references to nodes in the document. Modifying a node will invalidate the iterator. After modifying a node, attempting to iterate through the results will result in an error.
Results of NODE_SNAPSHOT types are snapshots, which are essentially lists of matched nodes. You can make changes to the document by altering snapshot nodes. Modifying the document doesn't invalidate the snapshot; however, if the document is changed, the snapshot may not correspond to the current state of the document, since nodes may have moved, been changed, added, or removed.
| Specification | Status | Comment |
|---|---|---|
| {{SpecName("DOM3 XPath", "xpath.html#XPathEvaluator-evaluate", "Document.evaluate")}} | {{Spec2("DOM3 XPath")}} | Initial specification |
{{Compat("api.Document.evaluate")}}