原文链接:JavaScript 获取任意元素点击后的 CSS 标准路径
下面的代码是一个原生的 JavaScript (JS) 版本,获取任意元素点击后的 CSS 标准路径(不用 jQuery) ,并处理 ShadowDOM。
注意: shadow DOM v1 已放弃对: : shadow 选择器的支持。 没有办法为影子 DOM 元素生成完整的 CSS 选择器。
<html>
<body>
<h3>标题</h3>
<ul>
<li>这里触发点击事件11</li>
<li>这里触发点击事件12</li>
</ul>
<ul>
<li>这里触发点击事件21</li>
<li>这里触发点击事件22</li>
</ul>
<ul>
<li>这里触发点击事件31</li>
<li>这里触发点击事件32</li>
</ul>
<script>
function getDomPath(el) {
if (!el) {
return;
}
var stack = [];
var isShadow = false;
while (el.parentNode != null) {
// console.log(el.nodeName);
var sibCount = 0;
var sibIndex = 0;
// 获取节点索引
for ( var i = 0; i < el.parentNode.childNodes.length; i++ ) {
var sib = el.parentNode.childNodes[i];
if ( sib.nodeName == el.nodeName ) {
if ( sib === el ) {
sibIndex = sibCount;
}
sibCount++;
}
}
// if ( el.hasAttribute('id') && el.id != '' ) { no id shortcuts, ids are not unique in shadowDom
// stack.unshift(el.nodeName.toLowerCase() + '#' + el.id);
// } else
var nodeName = el.nodeName.toLowerCase();
if (isShadow) {
nodeName += "::shadow";
isShadow = false;
}
if ( sibCount > 1 ) {
stack.unshift(nodeName + ':eq(' + (sibIndex + 1) + ')');
} else {
stack.unshift(nodeName);
}
el = el.parentNode;
if (el.nodeType === 11) { // for shadow dom, we
isShadow = true;
el = el.host;
}
}
//stack.splice(0,1); // 移除html标签
return stack.join(' > ');
}
document.addEventListener("click",function(event){
console.log(getDomPath(event.target));
})
</script>
</body>
</html>
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于