javascript - 在 JavaScript 中从 HTML 标题元素生成 TOC 的任何好代码?

标签 javascript jquery tableofcontents

我想在 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>

我真的卡住了:( 您如何编写生成 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 也许有更复杂的方法。 请指出您发现的任何内容。

谢谢。

最佳答案

首先,您需要关闭您的 h1、h2 标签 =)

如果你这样做 $("h1, h2, h3, h4, h5, h6")您将按照标签在文档中出现的顺序获得标签。所以你可以在那个数组上做一个循环并检查级别。例如:如果最后一个标签是 H1 而你找到了一个 H2,这意味着你需要创建一个 <ol> .另一方面,如果你有一个 H3 而下一个是 H2,这意味着你需要关闭 <ol>。 .

最难的部分是关闭剩余的 <ol>最后。

希望这对您有所帮助。

关于javascript - 在 JavaScript 中从 HTML 标题元素生成 TOC 的任何好代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5819807/

相关文章:

javascript - 在javascript中使变量成为函数

javascript - 表单中的运输详细信息验证

jquery - 在可拖动的 DIV 中添加图像按钮并在单击时切换图像源

java - Apache POI 目录未更新

python - autoflask Sphinx 的摘要或目录

javascript - 在 react 导航中刷新 contentComponent

jquery - 输入框值未定义

javascript - 只有在其他人选择后才更改为光标 :default on players with is-inactive class,

html - 在 html 中创建目录

javascript - 如何删除或隐藏过滤器运算符下拉列表