javascript - 将 string.indexOf 的结果转换为 DOM 元素的引用路径

标签 javascript html css dom xpath

给定以下代码:

<div class="parent">
  <div class="child">3</div>
</div>

let parent = document.querySelector('.parent');
let child = parent.querySelector('.child')
let strParent = parent.outerHTML.toString()
let strChild = child.outerHTML.toString()
let indexOfChild = strParent.indexOf(strChild)

既然我在字符串化的 HTML 中有了 child 的索引,我该如何将其转换为 DOM 路径(xpath/css 选择器)

抱歉,如果这不是 100% 清楚,英语不是我的第一语言。

最佳答案

根据您的问题猜测,应该这样做:

function getXPath(node) {
    var comp, comps = [];
    var parent = null;
    var xpath = '';
    var getPos = function(node) {
        var position = 1, curNode;
        if (node.nodeType == Node.ATTRIBUTE_NODE) {
            return null;
        }
        for (curNode = node.previousSibling; curNode; curNode = curNode.previousSibling) {
            if (curNode.nodeName == node.nodeName) {
                ++position;
            }
        }
        return position;
     }

    if (node instanceof Document) {
        return '/';
    }

    for (; node && !(node instanceof Document); node = node.nodeType == Node.ATTRIBUTE_NODE ? node.ownerElement : node.parentNode) {
        comp = comps[comps.length] = {};
        switch (node.nodeType) {
            case Node.TEXT_NODE:
                comp.name = 'text()';
                break;
            case Node.ATTRIBUTE_NODE:
                comp.name = '@' + node.nodeName;
                break;
            case Node.PROCESSING_INSTRUCTION_NODE:
                comp.name = 'processing-instruction()';
                break;
            case Node.COMMENT_NODE:
                comp.name = 'comment()';
                break;
            case Node.ELEMENT_NODE:
                comp.name = node.nodeName;
                break;
        }
        comp.position = getPos(node);
    }

    for (var i = comps.length - 1; i >= 0; i--) {
        comp = comps[i];
        xpath += '/' + comp.name;
        if (comp.position != null) {
            xpath += '[' + comp.position + ']';
        }
    }

    return xpath;

}

let parent = document.querySelector('.parent');
console.log(getXPath(parent));

let child = parent.querySelector('.child');
console.log(getXPath(child));
<div class="parent">
  <div class="child">3</div>
</div>

这将返回 parentchild 节点的 XPath。

关于javascript - 将 string.indexOf 的结果转换为 DOM 元素的引用路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51289331/

相关文章:

html - 如何覆盖 MVC Razor 中的@section

jquery - 具有延迟的 CSS3 动画逐个分区

javascript - rruleJS : Consideration of timezone for weekly case

php - 上传大文件时浏览器挂起

javascript - 在 sails js Node 框架中创建 url

html - 中心球员元素

html - 固定粘性标题

javascript - 为什么 jQuery 构造函数映射到 jQuery.fn.init?

javascript - 如何正确构建包含许多子级别的列表

javascript - Angular:如何从 elementRef 判断元素是否已给定类应用于它?