详解如何实现博文中自动生成文章目录的做法

在CSDN写过博客的人可能会使用它提供的“文章中H1到H6标签自动生成文章目录”这个功能。而且这样的文章看起来很醒目,能够快速的定位到自己想看的内容,可以说是深受广大博友的喜爱。那么这样友好的功能是如何实现的呢?且看小编今天为大家揭开它的神秘面纱。
先看看运行效果吧:
博客文章目录
整体运行效果看起来,还不错吧!点击此处查看详细运行效果
我先说下实现思路
1.整体目录使用的是ol和li标签实现
2.点击+、-判断是否展开和收起
3.使用a标签实现锚点定位

全部源码点击此处查看
我们今天的重点是如何让你的网站也支持这样的功能。做的思路如下:
1.查找所有的h1,h2,h3,h4,h5,h6标签(排除文章标题)
2.按h1到h6的顺序添加ol和li,并拼接成html,具体做法如下:
  所有的h1都作为Tree的1级节点,h2作为上一个h1的子节点,h3作为上一个h2的子节点,以此类推。
3.给对应的节点添加自定义的锚点
4.点击+、-符号,分别执行展开和收起动作

全部代码如下:

$(document).ready(function() {
    // :www.xttblog.com
    initCatalog();
});

function initCatalog() {
    var hs = $('#article').find('h1,h2,h3,h4,h5,h6');
    if (hs.length < 2)
        return;
    var html = '';
    html += '<div style="clear:both"></div>';
    html += '<div class="xttblog_toc">';
    html += '<p style="text-align:right;margin:0;"><span style="float:left;">目录';
    html += '<a href="#" title="系统根据文章中H1到H6标签自动生成文章目录">(?)</a></span>';
    html += '<a href="#" onclick="javascript:return openct(this);" title="展开">[+]</a></p>';
    html += '<ol style="display:none;margin-left:14px;padding-left:14px;line-height:160%;">';
    var old_h = 0, ol_cnt = 0;
    for (var i = 1; i < hs.length; i++) {
        var h_tag = parseInt(hs[i].tagName.substr(1), 10);
        if (!old_h)
            old_h = h_tag;
        if (h_tag > old_h) {
            html += '<ol>';
            ol_cnt++;
        }else if (h_tag < old_h && ol_cnt > 0) {
            html += '</ol>';
            ol_cnt--;
        }
        if (h_tag == 1) {
            while (ol_cnt > 0) {
                html += '</ol>';
                ol_cnt--;
            }
        }
        old_h = h_tag;
        var tit = hs.eq(i).text().replace(/^/d+[.、/s]+/g, '');
        tit = tit.replace(/[^a-zA-Z0-9_/-/s/u4e00-/u9fa5]+/g, '');

        if (tit.length < 100) {
            html += '<li><a href="#t' + i + '">' + tit + '</a></li>';
            hs.eq(i).html('<a name="t' + i + '"></a>' + hs.eq(i).html());
        }
    }
    while (ol_cnt > 0) {
        html += '</ol>';
        ol_cnt--;
    }
    html += '</ol></div>';
    html += '<div style="clear:both"><br></div>';
    $(html).insertBefore($('#article'));
}

function openct(e) {
    if (e.innerHTML == '[+]') {
        $(e).attr('title', '收起').html('[-]').parent().next().show();
    } else {
        $(e).attr('title', '展开').html('[+]').parent().next().hide();
    }
    e.blur();
    return false;
}

感兴趣的网页,可以制作成插件,放到github上!

版权声明:本文为博主原创文章,未经博主允许不得转载。

详解如何实现博文中自动生成文章目录的做法

: » 详解如何实现博文中自动生成文章目录的做法

原创文章,作者:wdmbts,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/251153.html

(0)
上一篇 2022年5月2日 01:57
下一篇 2022年5月2日 02:01

相关推荐

发表回复

登录后才能评论