写个小脚本输出简易目录

311 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

今天受了点刺激,进而激发了学习欲望,于是打开XX教育准备学习。文章才读了一半,总觉得哪里不太对劲,这标题… 应该是有层级的?打开 F12 看了一眼,哎是的… 可是这层级也太不明显了,肉眼分辨有点困难呀。

image.png

高中时代老师就常说:“看书先看目录,大标题、小标题,目录看下来你就知道整个说的是啥啦!” 因为养成了看目录的习惯,这不好识别的层级结构让我很是难受。于是琢磨着自己写个脚本把目录输出来看一下。

控制台输出简易目录

查看页面的DOM结构,发现文章的核心内容都在 .rich-text-wrap 节点中,且只有一级子节点,直接获取 children 再过滤出 h 元素节点,再按着想要的格式输出一下就可以了。事不宜迟,马上开始 ——

//获取文本节点
const nodes = document.getElementsByClassName('rich-text-wrap')[0].children
//筛选标题节点. 注意是大写H
const titleNodes = [].slice.apply(nodes).filter(node=>node.tagName.includes('H')) 
//构造目录结构:拼接节点内容
const baseLevel = titleNodes[0].tagName.slice(1,)
let str = ''
titleNodes.forEach(node=>{
    const level = node.tagName.slice(1,) - baseLevel
	const indent = ' '.repeat(level*4)
    str+= `${indent}|\n${indent}|--${node.innerHTML}\n`
})
//输出到控制台瞅瞅
console.log(str)

来看看效果:

image.png

哎~ 还可以,这下文章结构就清晰啦~ 要定位想看的内容也方便多了。

小知识复习

  • 获取到的 nodes 是个类数组,类数组没有遍历方法,需要先将类数组转为数组再遍历。上文用到的是 [].slice.apply() 方法。更多关于类数组和数组的知识,可查看我上一篇文章:类数组和数组
  • 在生成缩进当中用到了 repeat 方法去生成多个空格,这个方法平常没怎么用上,不过还真是好使哈哈哈,复习了。

碎碎念

  • emmm.. 这个用来应付这种篇幅不长的小文章是够了。如果篇幅较长,层级较多,这个输出是不是也太长了。果然还是弄成树结构输出比较好看吧,要能折叠那种。我印象中 console 好像有直接输出树的方法来着?会不会更便捷更美观呢,回头再看看。困了 - -

偶尔写写这种带来一定便利性的小脚本,会有幸福感哎~ 有知识派上用场了的感觉 ^ ^