指定contextNode执行XPath//a未返回预期DOM节点的问题
解决XPath相对查询无法定位上下文节点内元素的问题
问题核心:你用//a作为XPath表达式时,不管传入的上下文节点是什么,这个表达式都会从整个文档的根节点开始搜索所有<a>元素,所以才会返回外层的"outer"链接,而非div内的"inner"链接。
正确的相对路径写法
要基于上下文节点做相对查询,必须用.开头的表达式:
- 如果要查找上下文节点下所有后代的
<a>元素(包括子节点、孙节点等),用.//a - 如果只查找上下文节点的直接子节点
<a>,用./a(或者简写为a)
修正后的代码示例
const div = document.querySelector('div'); // 获取div内的第一个<a>元素文本 console.log(document.evaluate('.//a', div).iterateNext().innerText); // 输出"inner"
补充说明
document.evaluate的contextNode参数确实会作为查询的上下文,但XPath表达式的写法决定了是否利用这个上下文。//是绝对路径语法,会忽略上下文直接从根节点遍历,而以.开头的表达式才会从上下文节点开始搜索。
内容的提问来源于stack exchange,提问作者David Madl
相关产品推荐
相关产品推荐

