JavaScript 实现 XPath

发布于 2023-04-02 18:23:21 字数 1564 浏览 111 评论 0

实现一个函数,生成某个 DOM 元素的 xpath,主要包含两部分:标签层级和兄弟元素中的顺序。

<body>
  <ul>
    <li>
      <span>1</span>
    </li>
    <li>
      <span>2</span>
      <span>3</span>
      <span>4</span>
    </li>
  </ul>
</body>

如果传入 id = "span_3" 的元素,那么生成的 xpath 是 body>ul[0]>li[1]>span[2]

思路

我们的参数是目标节点,我们的目标是冒泡到 body,然后记录中间的节点即可。

整个过程是:

  • 我们通过 target 先找到了 parentNode,即 li。
  • 我们通过 li 找到了 parentNode,即 ul。
  • 我们通过 ul 找到了 parentNode,即 body。
  • 结束

另外 DOM Node 数据结构大概是:

{
  tagName: 'BODY',
  children: [
    {
      tagName: 'UL',
      children: [
        {
          tagName: 'LI',
          children: [{
            tagName: 'SPAN'
          }]
        }
      ]
    }
  ]
}

可以看出 DOM Node 是一种递归的数据结构,因此用递归来实现会非常直观和简洁。 如果不是特别严格的场景,通常也不会有严重性能问题。

关键点

  • DFS
  • 回溯
  • parentNode 获取父节点, children 获取子节点

代码


function helper(node, path) {
  if (node === document.body) return `body ${path}`;

  const i = Array.prototype.findIndex.call(node.parentNode.children, el => el === node)
  return  helper(node.parentNode, `${path} > ${node.tagName.toLowerCase()}[${i}]`);
}

function XPath(node) {
  return helper(node, '');
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

遇到

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文