<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> </head> <body> <div> hello world <span>你好世界</span> <span>你好世界</span> </div> </body> </html>
执行下面的代码
const xPathEvaluator = new XPathEvaluator() const expression = xPathEvaluator.createExpression('/html/body') console.log(expression.evaluate(document.querySelector('div')).iterateNext()) console.log(expression.evaluate(document).iterateNext())
evaluate 方法中第一个参数是上下文节点,以上执行的结果是相同的,都是 body 元素,请问一下这个上下文节点参数的作用是什么?
evaluate
方法的第一个参数传递给了该表达式。这个上下文节点参数指定了 XPath
表达式执行的 起始点 或者搜索的范围。
只不过在题主这个例子中,刚好 不会 体现出变化
如果将上下文节点设置为 document.querySelector('div')
,则表示从 div 元素开始执行 XPath 表达式。因此,在这种情况下,expression.evaluate(document.querySelector(‘div’)).iterateNext() 的结果是 body 元素。
- 首先,document.querySelector(‘div’) 选择了文档中的 div 元素作为上下文节点
- 然后,由于 div 内部没有 html 元素,因此无法匹配到
/html/body
这个路径。但是,在这种情况下,XPath 解析器会 自动向外 扩展搜索范围,并从整个文档的 根元素 开始进行搜索。因此,在最终结果中可以找到匹配/html/body
的第一个符合条件的节点,也就是 body 元素
如果将上下文节点设置为 document
,则表示从整个文档开始执行 XPath 表达式。所以 expression.evaluate(document).iterateNext() 的结果也是 body 元素。
可以看到,在题主的例子中,无论上下文节点是哪个元素( div
或 document
),XPath 表达式都会返回相同的结果 body 元素。因为/html/body
这个表达式本身就选择了 body 元素作为目标。
比如 ../span
是根据你的 evaluate() 的节点作为初始入口来判断的。