【发布时间】:2011-08-14 18:10:24
【问题描述】:
我想在 JavaScript 中生成如下 TOC:
<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>
以及上面生成 TOC 的 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>
我真的被困住了:( 您如何编写代码来生成 TOC?我更喜欢 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 也许有更复杂的方法。 请指出你发现的任何东西。
谢谢。
【问题讨论】:
-
到目前为止你做了什么?
-
我已经添加了 jQuery 标签,因为您可以使用 jQuery。这会让更多人关注它。
-
这感觉很多就像一个“请为我写这个”的伪问题。如果你被卡住了,这表明你已经尝试了一些东西。向我们展示您的尝试,我们很乐意帮助您解决问题。
-
哇。这么多cmets。谢谢大家,很抱歉这个愚蠢的问题。是的,我很懒:P
-
看看HTML5 Outliner 可能会有所帮助。
标签: javascript jquery tableofcontents