我有一个简单的js函数,可将我的dom路径返回给clicked元素。但是有时某些元素(通常是我点击过的元素)计数两次
所以如果我有以下代码
<ul>
<li><a href ='#'>Some link</a></li>
</ul>
输出可能像ul:nth-child(1) > li:nth-child(1) > a:nth-child(2)
whilea
应该是1个孩子。
这是功能代码
var getDomPath;
getDomPath = function(el) {
var count, element, nth, path, selector, sib;
element = el;
if (!(el instanceof Element)) {
return;
}
path = [];
while (el.nodeType === Node.ELEMENT_NODE && el.id !== "jobs") {
selector = el.nodeName.toLowerCase();
if (el.id) {
selector += "#" + el.id;
} else if (el.className) {
selector += "." + el.className;
} else {
sib = el;
nth = 1;
count = 1;
while (sib.nodeType === Node.ELEMENT_NODE && (sib = sib.previousSibling) && $(el).prev().prop('tagName') !== "STYLE" && $(el).prev().prop('tagName') !== null) {
count += $(el).prevAll().size();
}
selector += ":nth-child(" + count + ")";
}
path.unshift(selector);
el = el.parentNode;
}
return path.join(" > ");
};
代码已从咖啡转换为javascript,因此可能看起来有点糟
这是html,即时通讯试图获取路径
<td width="50%"><strong>Leveringssadresse</strong>
<br>
Hans Andersen
<br>
Andevej 123
<br>
1234 Andeby
<br>
Denmark
<br>
Telefon: 31122345
<br>
Mobiltelefon: 12232345
<br>
<a href="mailto:[email protected]">[email protected]</a>
<br>
</td>
在这里,当我单击a
element时,我希望它是nth-child(8)
,但是不知何故,我得到了17(在我的代码中,以1递增16 + 1)
问题在于此行:
while (sib.nodeType === Node.ELEMENT_NODE && (sib = sib.previousSibling) && $(el).prev().prop('tagName') !== "STYLE" && $(el).prev().prop('tagName') !== null) {
我已多次阅读此行,但无法弄清您要做什么。
您的代码说:
STYLE
我不知道该步骤的顺序是什么,但是如果最终条件通过,它将计算n * (x + 1) + 1
,其中n
是先前元素同级x
的数量,而是没有中间文本节点的紧接先前元素同级的数量。
下一行是这样的:
count += $(el).prevAll().size();
当然,这只应该运行一次,而完全没有条件。
count = $(el).prevAll().length + 1;
jsFiddle与工作代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句