gpt4 book ai didi

javascript - 如何打印 DOM 对象的选择器

转载 作者:行者123 更新时间:2023-11-29 20:57:31 25 4
gpt4 key购买 nike

给定一个像这样的 DOM 结构:

<div>
<div>
<span>
<img/>
<i>
<span></span>
<meter></meter>
</i>
<a><span></span></a>
</span>
</div>
<nav>
<form>
<input/>
<button></button>
</form>
</nav>
</div>

想知道你是如何接受它然后返回所有选择器的平面数组的:

[
'div > div > span > img',
'div > div > span > i > span',
'div > div > span > i > meter',
'div > div > span > a > span',
'div > nav > form > input',
'div > nav > form > button'
]

我的尝试没有成功:

function outputSelectors(array, node) {
var tag = node.tagName
array.push(tag)
for (var i = 0, n = node.children.length; i < n; i++) {
var child = node.children[i]
outputSelectors(array, child)
}
}

outputSelectors([], document.body.children[0])

不知道从这里去哪里。

最佳答案

一种可能,一种从顶部(准确地说是根)到底部的非递归方法:

function collectLeafNodePathes(root) {
const paths = [];
const selectorParts = [];
let el = root;
while (el) {
const tagName = el.tagName.toLowerCase();
if (el.childElementCount) {
selectorParts.push(tagName);
el = el.firstElementChild;
continue;
}

paths.push(selectorParts.concat([tagName]).join(' > '));
do {
if (el.nextElementSibling) {
el = el.nextElementSibling;
break;
}
el = el.parentNode;
selectorParts.pop();
if (el === root) {
el = null;
}
} while (el);
}
return paths;
}

const selectors = collectLeafNodePathes(document.getElementById('xxx'));
console.log(selectors);
<div id="xxx">
<div>
<span>
<img/>
<i>
<span></span>
<meter></meter>
</i>
<a><span></span></a>
</span>
</div>
<nav>
<form>
<input/>
<button></button>
</form>
</nav>
</div>

不过,最后一部分(do-while 循环)的边缘有点粗糙;对任何改进持开放态度。

我使用了辅助属性(childElementCountfirstElementChildnextElementSibling)来跳过对文本节点和内容的检查。如果这不是一个选项(出于兼容性原因),则很容易实现 polyfill 或只是在非元素节点上“倒回”循环。

关于javascript - 如何打印 DOM 对象的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48522673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com