给定以下代码:
<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>
这将返回 parent
和 child
节点的 XPath。
关于javascript - 将 string.indexOf 的结果转换为 DOM 元素的引用路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51289331/