执行结果:

<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>

  

最新文章

  1. 问题(the question)
  2. 洛谷 P1198 [JSOI2008]最大数 Label:线段树
  3. 为什么上传文件的表单里要加个属性enctype
  4. [Effective JavaScript 笔记]第24条:使用变量保存arguments对象
  5. HTML5 canvas 在线画笔绘图工具(一)
  6. 发布.NET MVC网站 到Azure
  7. Maven 结合 IDEA 入门实践
  8. Django学习-14-分页功能实例
  9. Framework7 索引列表插件的异步加载实现
  10. 导出到word
  11. python3+selenium入门13-操作cookie
  12. mvc 过滤器篇
  13. html5 + thyleaf引擎
  14. Map集合遍历的四种方式理解和简单使用
  15. 解决GP服务产生的结果无法自动发布为地图服务的问题
  16. Spring AMQP 源码分析 03 - MessageConverter
  17. docker node项目 连接mongodb
  18. 20155309南皓芯 实验2 Windows口令破解
  19. Application.DoEvent和定时刷新控件
  20. Mysql链接字符串问题

热门文章

  1. 默认路由、RIPv2、OSPF、EIGRP配置(全网全通)
  2. spring异常处理器
  3. 运行容器的最佳实践 - 每天5分钟玩转 Docker 容器技术(24)
  4. 移动端H5通用表单验证插件
  5. Eclipse导入项目常见问题----facet版本问题04
  6. linq中给字段添加别名
  7. Java IO学习笔记四
  8. Mysql数据库存储emoji表情
  9. Discuz更改默认搜索模块
  10. 手把手教你从基础学习JQuery