有什么好的代码可以在 JavaScript 中从 HTML 标题元素生成目录吗?
我想在 JavaScript 中生成如下所示的目录:
<ol>
<li>Heading 1</li>
<li>Heading 2
<ol>
<li>Heading 2-1</li>
<li>Heading 2-2</li>
</ol>
</li>
<li>Heading 3</li>
</ol>
以及用于生成上面目录的 HTML 代码:
<section id="toc">
<p>This will be replaced with generated TOC.
</section>
<article>
<h1>Heading 1<h1>
<p>Bla bla bla.</p>
<h1>Heading 2<h1>
<p>Bla bla bla.</p>
<h2>Heading 2-1<h2>
<p>Bla bla bla.</p>
<h2>Heading 2-2<h2>
<p>Bla bla bla.</p>
<h1>Heading 3<h1>
<p>Bla bla bla.</p>
</article>
我真的被困住了:( 如何编写生成目录的代码?我更喜欢 jQuery 或纯 JavaScript。
更新
这对我来说相当困难,但不知何故我想我已经完成了:
$(function () {
var assigned_level = 0,
current_level = 0,
id_number = 1,
parent_node = "article",
toc_html = '';
$(parent_node + " *").each(function () {
if (this.nodeName.length === 2 && this.nodeName.charAt(0) === "H") {
$(this).attr("class", "heading");
}
});
$(".heading").each( function () {
current_level = this.nodeName.charAt(1);
$(this).attr('id', "toc-" + id_number);
// Close a list if a same level list follows.
if (assigned_level !== current_level - 1) {
toc_html += "</li>"
}
// Open parent lists if a child list follows.
while (assigned_level < current_level) {
toc_html += "<ol>";
assigned_level += 1;
}
// Close child lists and the parent list if
// the same level parent list follows.
while (assigned_level > current_level) {
toc_html += "</ol></li>";
assigned_level -= 1;
}
toc_html +=
'<li><a href="#' + this.id + '">' + $(this).html() + "</a>";
id_number += 1;
});
// Close everything
while (assigned_level > 0) {
toc_html += "</li></ol>";
assigned_level -= 1;
}
$("#toc").html(toc_html);
});
我仍然不明白我做了什么:P也许有更复杂的方法。 请指出您发现的任何内容。
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
首先,你需要关闭你的 h1,h2 标签 =)
如果你这样做
$("h1, h2, h3, h4, h5, h6")
你会得到相同的标签它们出现在文档上的顺序。因此,您可以对该数组执行循环并检查级别。例如:如果最后一个标签是 H1,而您找到了 H2,则意味着您需要创建一个。另一方面,如果您有一个 H3,而下一个是 H2,则意味着您需要关闭
。
最难的部分是最终关闭剩余的
。
希望这有帮助。
first of all, you need to close your h1,h2 tags =)
if you do
$("h1, h2, h3, h4, h5, h6")
you'll get the tags in the same order they appear on the document. So you could do a loop on that array and check the level. e.g: if the last tag was H1 and you find a H2, it means that you need to create a<ol>
. On the other hand, if you have a H3 and the next one is an H2, it means that you need to close the<ol>
.The hardest part would be to close the remaining
<ol>
in the end.Hope this helps.
在我们看到您到目前为止所取得的成果之前,目前不想太深入。
但是,请查看 .each() .children() 和 .find()。这些应该会给您一些关于如何完成您想要做的事情的想法。
Don't want to go too into depth at the moment until we see what you've come up with so far.
However, look into .each() .children() and .find(). These should give you some ideas of how to accomplish what you're looking to do.
我知道这个问题已经有 8 年历史了,但这里有一个建议。
可能不是最有效的方法,也不是最短的方法,但它确实有效。
在页面末尾添加以下 JavaScript:
您将获得预期结果:
I know this question is 8 years old, but here's a proposition.
Probably not the most efficient way to do it, nor the shortest, but it works.
In the end of your page, add the following JavaScript:
You'll get the intended result: