分享

如何用Javascript实现自动为页面添加目录结构 | Cafe Stop

 RoryShaw 2013-09-09

当页面内容比较多的时候,清晰的页面结构加目录导航能帮助用户方便的找到所需要的信息,接下来介绍如何利用jQuery自动为页面生成目录结构。网上其实已经有好多jQuery的插件可以实现同样的目的,我的这边文章就介绍过其中一个[通过jQuery自动给wordpress博文添加目录结构],而本文还有个目的是介绍其是如何实现的并顺带介绍创建jQuery插件的一些注意点。

下面的代码片断是典型的jQuery插件的结构,这里有2点值得注意:

  1. 因为是jQuery实例扩展,所以是jQuery.fn.extend,如果是在jQuery类上扩展,则应该使用jQuery.extend
  2. 使用了自调用的匿名函数,这样处理的好处是a)保证该javascript文件被载入后就被调用;b)保证内部使用$代替jQuery而不会跟其它模块冲突。
  1. (function($){
  2. $.fn.extend({
  3. plugin: function(options){
  4. //实现代码
  5. }
  6. });
  7. )(jQuery);

如何自动添加目录结构(前提是页面本身具有良好的组织结构,正确使用H1,H2,H3等Heading标签)。思路是这样的:

  1. 在所有的H1,H2和H3标签前添加<span>元素并设定其Id,使得可以通过<a>元素定位到该Heading标签。
  2. 构建如<ul><li><a/></li><li><a/></li></ul>形式的目录结构,并是所有<a>标签分别指向对应的<span>。
  3. 将该目录结构放入用户指定的HTML元素中。

如下面代码所示:

  1. (function($){
  2. $.fn.extend({
  3. mytoc: function(options){
  4. //默认参数
  5. var defaultParams = {
  6. prefix:'toc', //生成目录结构中元素的class属性的前缀
  7. selectors:'h1, h2, h3', //页面由h1,h2,h3来组织
  8. context:'body' //处理body标签下面的selectors
  9. };
  10. //用户可以通过传入自定义参数来覆盖默认设置
  11. var opts = $.extend({}, defaultParams, options);
  12. //获取所有需要加入到目录结构中的“头”元素
  13. var headings = $(opts.selectors, opts.context);
  14. //在所有的“头”元素前加上锚标签,如<span id="toc0">
  15. headings.each(function(i, heading){
  16. $('<span/>').attr('id', opts.prefix + i).insertBefore(heading);
  17. });
  18. //必须返回$(this).each(function(){}); 只有这样才能兼容jQuery的$.a().b().c()这种连续调用
  19. return $(this).each(function(i, toc){
  20. //构建目录结构
  21. var ul = $('<ul/>').attr('id', 'toc');
  22. headings.each(function(i, heading){
  23. var a = $('<a/>').attr('href', '#'+opts.prefix + i).text($(heading).text());
  24. var li = $('<li/>').addClass(heading.tagName.toLowerCase() + '-' + opts.prefix).append(a);
  25. ul.append(li);
  26. });
  27. //将生成的目录结构ul对象添加到用户指定的HTML对象中
  28. $(toc).html(ul);
  29. });
  30. }
  31. });
  32. })(jQuery);

如何使用:

  1. <html>
  2. <head>
  3. <title>Test TOC</title>
  4. <script src="http://ajax./ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  5. <script type="text/javascript" src='jquery.mytoc.js'></script>
  6. </head>
  7. <body>
  8. <div id="toc"></div>
  9. <h1>Heading 1</h1>
  10. <h2>Sub Heading 1</h2>
  11. <h2>Sub Heading 2</h2>
  12. <h2>Sub Heading 3</h2>
  13. <h1>Heading 2</h1>
  14. <h2>Sub Heading 1</h2>
  15. <h2>Sub Heading 2</h2>
  16. <h2>Sub Heading 3</h2>
  17. <h1>Heading 3</h1>
  18. <h2>Sub Heading 1</h2>
  19. <h2>Sub Heading 2</h2>
  20. <h2>Sub Heading 3</h2>
  21. <h2>Sub Heading 4</h2>
  22. <script>
  23. jQuery('div#toc').mytoc();
  24. </script>
  25. </body>
  26. </html>

源代码已经放到github上 – mytoc。真正将上述代码用到产品环境自动生成目录结构还需要编写相应的CSS代码,而且目录结构的层次关系还需要通过CSS代码体现出来。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多