我是Xpath的初学者,想知道是否有办法在javascript / jquery中获取元素的xpath。我需要一种绝对的方法来识别一个元素,我知道Xpath用于此,但无法弄清楚如何。
场景是我有一个元素的jquery引用。我想让它的xpath在鼠标点击时存储在数据库中。 如果有jquery引用,如何获取HTML元素的Xpath。我需要能够稍后将Xpath转换为绝对元素
function clickTrack(event){
offset=event.pageX;
var xpath=getXpath(this);//I need the xpath here
data={'xpath':xpath,'offset':offset};
}
答案 0 :(得分:7)
您可以从我曾写过的XPath工具中提取此功能:
http://webkitchen.cz/lab/opera/xpath-tool/xpath-tool.js
编辑:你走了:
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;
}
如果您希望它也能在IE中运行,可能需要进行一些更改。
答案 1 :(得分:3)
没有“元素”的“XPath”。
当人们提出这个问题时,他们通常会想要三件事之一:
(a)元素祖先中元素的名称,例如/ a / b / c / d
(b)如(a)但添加了位置信息,例如/ a [2] / b [3] / c [1] / d [4]。 (一种变体是只想要位置信息而不是还原剂)
(c)as(b)但没有名称空间依赖关系,例如/ [namespace-uri()='x'和local-name()='y'] [1] / [namespace-uri()='x'和local-name ='z'] [5] / ...
这三个都很容易用任何语言构建一个简单的递归函数。
答案 2 :(得分:3)
您可以使用https://github.com/bermi/element-xpath
上的Github库来解决这个问题包含脚本
<script src="https://raw.github.com/bermi/element-xpath/master/element-xpath.min.js" type="text/javascript"></script>
使用此代码
document.body.addEventListener("click", function (ev) {
console.log(ev);
console.log(ev.toElement);
var xpath = getElementXpath(ev.toElement);
console.log(xpath);
});
答案 3 :(得分:1)
需要更多信息,但如果你有一个元素的ID很容易。例如,如果您的jquery引用正在抓取id =“myDiv”的div,那么合适的xpath将是
//div[@id="myDiv"]
这是一个xpath教程:http://www.tizag.com/xmlTutorial/xpathtutorial.php
一个很好的参考:https://developer.mozilla.org/en/XPath
编辑:我看到你只想要给出节点的绝对xpath。在这种情况下,我相信您必须使用parentNode
(reference here)向后移动DOM树来构建xpath。您还需要做一些工作来检查每个节点基于标签名称的子编号。还要记住,在xpath中,索引以规范(reference here)从1开始,而不是0。
编辑#2:请参阅此post中的getPathTo()
。它不会一直向上移动,但它会获得相对于兄弟姐妹的位置。此外,还有一个不可接受的答案是对绝对路径here的全面尝试。