javascript - 如何通过 Javascript 使用 HTML 页面中现有的标题标签创建书签系统

标签 javascript html css

我想使用 HTML 文档中的标题创建一个书签系统。我想使用标题层次结构来做到这一点。我的标题如下。我试过了但失败了。 enter image description here

我想要像下面这样带有链接的我的书签:

enter image description here

我的 HTML 代码:

    <style>
    #bookMark {
      border: 1px solid black;
      margin-bottom: 10px;
    }
    </style>

    <div id="bookMark">
    <b>Book Mark: </b>
    </div>

    <h1> This is 1st main Heading1 </h1>
      <h2> This is h2 under h1 </h2>
          <h3> This is h3 under h1 and h2 </h3>

      <h2> This is h2 </h2>
         <h3> This is h3</h3> 

    <h1> This is 2nd main Heading1 </h1>
      <h2> This is h2 under h1 </h2> 

    <script src="dom.js"> </script>

我的脚本代码:

    var heading1 = document.getElementsByTagName('h1');
    var heading2 = document.getElementsByTagName('h2');

    for(var i = 0; i < heading1.length; i++){
     var para = document.createElement("p");
     para.innerHTML = document.getElementsByTagName('h1')[i].innerHTML;
     document.getElementById("bookMark").appendChild(para);

      for(var j = 0; j < heading2 .length; j++){
        var para = document.createElement("p");
        para.innerHTML = "&nbsp;"+ document.getElementsByTagName('h2')[j].innerHTML;
        document.getElementById("bookMark").appendChild(para);
      }

    }

我的输出: 这不是维护层次结构 enter image description here

最佳答案

为文档动态创建链接目录列表的一种方法是首先制作标题的映射,使用:

const allHeadings = document.querySelectorAll('h1, h2, h3, h4, h5, h6');

然后你可以遍历 map 来构造内容列表:

工作示例:

// GRAB ALL HEADINGS
const allHeadings = document.querySelectorAll('h1, h2, h3, h4, h5, h6');

// CREATE MAP OF HEADINGS
let headingsMap = []

allHeadings.forEach((heading) => {
  
  headingLevel = heading.nodeName.replace('H', '');
  headingsMap.push(headingLevel);
});

// BUILD CONTENTS LIST
let contentsList = '';
contentsList += '<div class="contents-list">';
contentsList += '<ul>';

for (let i = 0; i < headingsMap.length; i++) {

  allHeadings[i].id = '10' + i;

  contentsList += '<li>';
  contentsList += '<a href="#10' + i;
  contentsList += '">' + allHeadings[i].textContent + '</a>';
  
  switch (true) {
  
    case (i === (headingsMap.length - 1)) :
      for (j = 0; j < headingsMap[i]; j++) {
        contentsList += '</li></ul>';
      }
    break;
  
    case (headingsMap[(i + 1)] > headingsMap[i]) :
      contentsList += '<ul>';
      break;
      
    case (headingsMap[(i + 1)] < headingsMap[i]) :
      let difference = (headingsMap[i] - headingsMap[(i + 1)]);
      for (j = 0; j < difference; j++) {
        contentsList += '</li></ul>';
      }
      break;
  }
}

contentsList += '</div>';

//  ADD CONTENTS LIST TO PAGE
let contentsListTemplate = document.createElement('template');
contentsListTemplate.innerHTML = contentsList;
document.body.insertBefore(contentsListTemplate.content, document.body.querySelector('*'));
.contents-list {
color: rgb(127, 0, 0);
font-size: 14px;
line-height: 28px;
text-transform: uppercase;
background-color: rgb(255, 255, 191);
border: 1px solid rgb(127, 0, 0);
}

.contents-list a {
  text-decoration: none;
}

.contents-list a:hover {
  text-decoration: underline;
}
<h1> This is 1st main Heading1 </h1>
<h2> This is h2 under h1 </h2>
<h3> This is h3 under h1 and h2 </h3>

<h2> This is h2 </h2>
<h3> This is h3</h3> 

<h1> This is 2nd main Heading1 </h1>
<h2> This is h2 under h1 </h2>
<h2> This is another h2 under h1 </h2>
<h3> This is h3 </h3>
<h4> This is h4 </h4>
<h2> This is h2 </h2>

关于javascript - 如何通过 Javascript 使用 HTML 页面中现有的标题标签创建书签系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58657432/

相关文章:

image - 带边距的图像内边框

javascript - 使用 Tensorflow.js 开发游戏 AI

javascript - 如何在没有 jQuery 的情况下在 div 之间平滑滚动

javascript - 调用 Javascript 工厂方法

javascript - Jquery、Bootstrap 子菜单在本地 .js 文件的情况下不显示

javascript - 适用于 IE 6 的 Jquery 旋转图像 >

javascript - 我有一个用于 onclick 的 Windows onload 函数 如何添加 onblur 事件并将其合并为一个?

html - 使用css限制屏幕大小

html - 两个不同的 div 列中行的高度相等

html - 为什么不应用 letter-spacing 属性?