执行结果:

<body>
<script type="text/javascript">
/**
* 这个模块注册一个可在页面加载完成后自动运行的匿名函数,当执行这个函数时会去文档中查找
* id为‘TOC'的元素,如果这个元素不存在,就创建一个元素
*
* 生成的TOC目录应当具有自己的CSS样式,整个目录区域的样式className设置为“TOCEntry”
* 同样我们为不同层级的目录标题定义不同的样式,<h1>标签生成标题
* className为“TOCLevel1”,<h2>标签生成的标题className为“TOCLevel2”,以此类推
* 段编号的样式为"TOCSectNum"
*
* css代码的随后一行表示每个段编号之后都会有一个冒号和空格符,若要隐藏段编号,
* 请使用这行代码:
* .TOCSectNum{display:none;}
*
* 这个模块需要onLoad()工具函数
*/
window.onload = (function(){ //匿名函数定义了一个局部作用域
//查找TOC容器元素
//如果不存在,则在文档开头处创建一个
var toc = document.getElementById('TOC');
if(!toc){
toc = document.createElement("div");
toc.id = "TOC";
document.body.insertBefore(toc,document.body.firstChild);
} //查找所有标题元素
var headings;
if(document.querySelectorAll){
headings = document.querySelectorAll("h1,h2,h3,h4,h5,h6");
}else{ //否则,查找方法稍微麻烦一些
headings = findHeadins(document.body,[]);
} //递归遍历document的body,查找标题元素
function findHeadins(root,sects){
for(var c = root.firstChild; c!= null; c= c.nextSibling){
if(c.nodeType !== 1)
continue;
if(c.tagName.length === 2 && c.tagName.charAt(0) ==="H")
sects.push(c);
else
findHeadins(c,sects);
}
return sects;
} //初始化一个数组来保持跟踪章节号
var sectioinNumbers = [0,0,0,0,0,0]; //现在,循环已找到的标题元素
for(var h = 0 ; h < headings.length ; h++ ){
var heading = headings[h]; //跳过在TOC容器中的标题元素
if(heading.parentNode == toc )
continue; //判定标题的级别
var level = parseInt( heading.tagName.charAt(1));
if( isNaN( level ) || level < 1 || level > 6 )
continue; //对于该标题级别增加sectionNumbers对应的数字
//重置所有标题比级别低的数字为零
sectioinNumbers[level-1]++;
for(var i = level; i<6 ; i++)
sectioinNumbers[i] =0; //现在,将所有标题级别的章节号组合产生一个章节号 如;2.3.1
var sectioinNumber = sectioinNumbers.slice(0,level).join("."); //位标题级别增加章节号
//把数字放在<span>中,使得其可以用样式修饰
var span = document.createElement("span");
span.className = "TOCSectNum";
span.innerHTML = sectioinNumber ;
heading.insertBefore(span , heading.firstChild); //用命名的锚点将标题包起来,以便为它增加链接
var anchor = document.createElement("a");
anchor.name = "TOC"+sectioinNumber;
heading.parentNode.insertBefore(anchor , heading);
anchor.appendChild(heading); //现在为该节点创建一个链接
var link = document.createElement("a");
link.href = "#TOC"+sectioinNumber; //链接的目标地址
link.innerHTML = heading.innerHTML; //链接文本与标题一致 //将链接放在一个div中,div用基于级别的名字的样式修饰
var entry = document.createElement('div');
entry.className = "TOCEntry TOCLevel"+level;
entry.appendChild(link); //该div添加到TOC容器中
toc.appendChild(entry);
}
}); </script>
<h1>这是h1</h1>
<h2>这是h2</h2>
<h3>这是h3</h3>
<h1>这是h1</h1>
<h4>这是h4</h4>
<h5>这是h5</h5>
<h6>这是h6</h6>
</body>

  

JavaScript一个生成文档目录的实例的更多相关文章

  1. 前端那点事儿——Tocify自动生成文档目录

    今天偶然间看到文档服务器有一个动态目录功能,点击目录能跳转到指定的位置:窗口滑动也能自动更新目录的焦点. 效果 框架 原来使用的是一个开源的jquery-ui控件——tocify.js,它可以遍历页面 ...

  2. JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 [TOC] 一.缘由 由于在ES6之前,JavaScript中没有定义类(class)语法.导致大家用各种五花八门的办法来定义类,代码风格不统一.而且对于模拟面向对象的三大支柱& ...

  3. JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 一.缘由 在很多的面向对象编程语言中,我们可以使用命名空间(namespace)来组织代码,避免全局变量污染.命名冲突.遗憾的是,JavaScript中并不提供对命名空间的原生支 ...

  4. 使用Ldoc给Lua生成文档

    Ldoc介绍 LDoc是一个Lua的文档生成工具,过去,比较常用的Lua生成文档的工具是LuaDoc,可惜作者自从2008年之后就再也没有发布过新的版本了,说明作者基本上已经放弃维护了.而LDoc则是 ...

  5. C#依据word模版动态生成文档

    新生开学,各院系辅导员代领校园卡.需要打印一份领取卡的协议,协议模版固定,但各院系卡的数量不同.需要从excel表格中抽取数据往word文件中填,同事咨询是否可以用word中的邮件合并功能,心想有这功 ...

  6. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  7. xcode 自动添加注释,生成文档

    一.自动生成注释代码        添加一个快捷键,生成 注释代码        ThisService 下载连接:http://wafflesoftware.net/thisservice/     ...

  8. newlisp 注释生成文档

    最近写了一个newlisp_armory库,用来实现一些newlisp自身不支持的操作.比如跨windows和ubuntu的目录拷贝功能等. 自己用的时候,发现没有API reference文档参考, ...

  9. eoLinker 新功能发布,增加了识别代码注释自动生成文档功能

    产品地址:https://www.eolinker.com开源代码:https://www.eolinker.com/#/os/download在线生成代码注释工具:http://tool.eolin ...

随机推荐

  1. Lesser known dplyr tricks

    In this blog post I share some lesser-known (at least I believe they are) tricks that use mainly fun ...

  2. 前端向后台的华丽转身 — PHP入门篇

    三个月就这么悄悄溜走了,本K对于前端虽然有了一定的认识,但对一些方面还是处于一种比较萌币的状态,就在这种萌币状态下,本K又跟着大神浩开始了后台语言-PHP语言的学习.PHP的学习对于学过其他语言的人来 ...

  3. Python进制转换(二进制、十进制和十六进制)

    #!/usr/bin/env python # -*- coding: utf-8 -*- # 2/10/16 base trans. wrote by srcdog on 20th, April, ...

  4. 动态添加Redis密码认证

    如果redis已在线上业务使用中,但没有添加密码认证,那么如何在不影响业务服务的前提下给redis添加密码认证,就是一个需要仔细考虑的问题. 本文描述一种可行的方案,适用于客户端使用了jedis连接池 ...

  5. Django中通过filter和simple_tag为前端实现自定义函数

    Django的模板引擎提供了一般性的功能函数,通过前端可以实现多数的代码逻辑功能,这里称之为一般性,是因为它仅支持大多数常见情况下的函数功能,例如if判断,ifequal对比返回值等,但是稍微复杂一些 ...

  6. 由 “无法使用从远程表选择的 lob 定位符” 错误而引导出来的一系列问题解决方案

    周一上班遇到一个数据加工问题:无法使用从远程表选择的 lob 定位符,由于数据源表不是自己的,不能对源数据做修改,于是我打起了存储过程的主意 我们公司的存过是分三步走,第一层是同步源数据,第二层是对一 ...

  7. CSDN删除上传资源的办法

    转自网友:http://blog.csdn.net/ssergsw/article/details/12489101 我按照下面的方法一试,果然成功了. 昨天晚上进行测试,上传了一个压缩包和大家分享, ...

  8. Python中的枚举

    在Python中想要实现枚举功能的方式比较多,可以通过字典这一数据结构,利用键与值的对应关系,可以实现枚举的功能. my_Enum={ 'red':1, 'yellow':2, 'blue':3 } ...

  9. [0] 服务器 TCP 提供程序无法在 [ 'any' <ipv4> *] 上侦听。TCP 端口已在使用中。

    配置工具——配置管理器——SQLEXPRESS协议下的TCP/IP协议 将其已启用改为禁用. 同时停止SQLEXPRESS服务即可

  10. 解决(防止)DDOS攻击的另一种思想

    本方案适合作最后的处理方案. 在服务器遭到DDOS攻击后,防火墙.高防盾或者其他的方案都已经失去了效力,这时运维人员无任何方案可以处理,并且只能任由DDOS攻击或关闭服务器时,该方案可以有限的抵挡大部 ...