【发布时间】:2020-04-15 16:00:48
【问题描述】:
我正在尝试将级别分类添加到具有嵌套列表项的列表中。 我想要以下结构。
<ul class="parent parent-level-1">
<li class="child child-level-1"><a>Title level 1</a></li>
<li class="child child-level-1"><a>Title level 1</a>
<ul class="parent parent-level-2">
<li class="child child-level-2"><a>Title level 2</a>
<ul class="parent parent-level-3">
<li class="child child-level-3"><a>Title level 3</a></li>
<li class="child child-level-3"><a>Title level 3</a></li>
</ul>
</li>
<li class="child child-level-2"><a>Title level 2</a>
<ul class="parent parent-level-3">
<li class="child child-level-3"><a>Title level 3</a></li>
<li class="child child-level-3"><a>Title level 3</a></li>
<li class="child child-level-3"><a>Title level 3</a></li>
</ul>
</li>
</ul>
</li>
<li class="child child-level-1"><a>Title level 1</a>
<ul class="parent parent-level-2">
<li class="child child-level-2"><a>Title level 2</a></li>
</ul>
</li>
<li class="child child-level-1"><a>Title level 1</a></li>
<li class="child child-level-1"><a>Title level 1</a>
<ul class="parent parent-level-2">
<li class="child child-level-2"><a>Title level 2</a></li>
</ul>
</li>
</ul>
如您所见,父列表中存在一些嵌套列表,它们同时可能包含另一个嵌套列表。 我尝试了以下 Javascript 函数,其中 parent 是主列表的父级,而 level 是第一级的整数,可以是 0 或 1。
function addLevelClass(parent, level) {
const iteration = parent.querySelectorAll("ul");
const firstUL = parent.querySelector("ul");
firstUL.classList.add("parent", "parent-level-" + level);
const firstItems = parent.querySelectorAll("li");
console.info(firstItems);
// No point if no list items.
if (!firstItems.length) {
return;
}
//loop trough fisrt-level li
for (let c = 0; c < firstItems.length; c++) {
const childrenLi = firstItems[c];
//add a child class to the li
childrenLi.classList.add("child", "child-level-" + level);
}
// No point if no list items.
if (!iteration.length) {
return;
}
for (let g = 0; g < iteration.length; g++) {
const levelIncrement = level + g;
const parentUL = iteration[g].querySelector("ul");
//add a parent class to the ul
parentUL.classList.add(
"parent",
"parent-level-" + (level + levelIncrement)
);
//fetch all the li's that are direct children of the ul
const childItems = parentUL.querySelectorAll("li");
// No point if no list items.
if (!childItems.length) {
return;
}
//loop trough each li
for (let c = 0; c < childItems.length; c++) {
const childrenLi = childItems[c];
//add a child class to the li
childrenLi.classList.add(
"child",
"child-level-" + (level + levelIncrement)
);
}
}
}
函数在 3er 级别的某处丢失,无法为列表的其余部分设置级别。
【问题讨论】:
-
你正在尝试做一个 DFS 顺便说一句 -
标签: javascript ecmascript-2016