【发布时间】:2020-07-14 02:39:09
【问题描述】:
我正在创建一个简单的脚本,它遍历 DOM 并返回一个包含在 DOM 中找到的元素的树对象。递归遍历本身非常简单,但我想/需要跳过某些元素并包含其他元素。我该怎么做?
这是我的 HTML:
<div data-element="from-here">
<div>skip me</div>
<div>
<div data-element="awesome">awesome text</div>
<div data-element="collect-me">
awesome text
<div data-element="also-me">
other text
<div class="but-not-me">...</div>
</div>
</div>
</div>
</div>
还有我的递归遍历代码:
const root = document.querySelector('[data-element="from-here"]');
function traverse(node) {
return {
element: node.dataset.element,
children: Array.from(node.querySelectorAll(':scope > div')).map(childNode => traverse(childNode)),
};
}
traverse(root);
如您所见,代码查询所有 div 元素,但我只需要具有data-element 属性的元素。我不能只做 `node.querySelectorAll(':scope > [data-element]') 因为那不会超过第一个 div。
这是我想要的结果:
{
element: 'from-here',
children: [
{
element: 'awesome',
children: [],
},
{
element: 'collect-me',
children: [
{
element: 'also-me',
children: [],
}
]
}
]
}
任何帮助将不胜感激!
【问题讨论】:
-
使用后代选择器而不是子组合器。
-
@Teemu 将在每次迭代中返回所有降序元素。我需要直接后裔,但跳过每个没有 data-element 属性的元素。
标签: javascript html recursion dom traversal