根据H标签自动生成导航目录

根据H标签自动生成导航目录

提取页面中的H标签自动生成目录,并且能够实现锚点定位

假设页面的部分内容如下,同时为了展现出锚点定位的效果,给包含内容的div元素设置一定高度

  <div id="menu">menu</div>
  <div id="wrap">
    <h2>header1</h2>
    <div>aaaaa</div>
    <h3>header1-1</h3>
    <div>bbbbb</div>
    <h3>header1-2</h3>
    <div>ccccc</div>
    <h2>header2</h2>
    <div>ddddd</div>
    <h3>header2-1</h3>
    <div>eeeee</div>
    <h3>header2-2</h3>
    <div>fffff</div>
    <h2>header3</h2>
    <div>ggggg</div>
    <h3>header3-1</h3>
    <div>hhhhh</div>
    <h3>header3-2</h3>
    <div>iiiii</div>
  </div>

 

现在实现一个函数,提取页面中的H标签,将生成的导航目录放在id为menu的div内

function createMenu() {
// 首先获取所有H标签,若页面中有h4,h5,h6则可以添加到参数中
var headList = [...document.querySelectorAll('h1,h2,h3')]
// 将H标签构造成一棵树,就可以明确H标签之间的层级
var root = { children: [] } var h = { node: headList[0], children: [], parent: root } root.children.push(h) headList.reduce(function (pre, cur) { var n = { node: cur, children: [] } while (h.node.localName[1] - n.node.localName[1] !== -1) { h = h.parent if (h === root) { break } } n.parent = h h.children.push(n) h = n return h })
    // 给H标签加id
var index = 1 function createList(list) { var text = list.reduce(function (pre, cur) { var childText
      // 判断该H标签有没有子层H标签
if (cur.children.length) { childText = createList(cur.children) } else { childText = '' } cur.node.id = 'header' + index++ pre += `<li> <a href="#${cur.node.id}"> ${cur.node.innerHTML} </a> ${childText} </li>` return pre }, '') var text = `<ul> ${text} </ul>` return text } var content = createList(root.children) document.getElementById('menu').innerHTML = content }

 

posted on 2020-10-28 18:39  尘光  阅读(1091)  评论(0)    收藏  举报

导航