文章或博客自動生成章節(jié)目錄索引(支持三級)的實現(xiàn)代碼
自動生成章節(jié)目錄索引(只支持一級)
一個好的博文除了博文的質(zhì)量要好以外,好的組織結(jié)構(gòu)也能讓讀者閱讀的更加舒服與方便,我看園子里面有一些園友的博文都是分章節(jié)的,并且在博文的前面都帶有章節(jié)的目錄索引,點(diǎn)擊索引之后會跳轉(zhuǎn)到相應(yīng)的章節(jié)閱讀,并且還可以回到目錄頂端,其中 Fish Li 的博文就是這種組織,當(dāng)然這種結(jié)構(gòu)如果是在寫博文的時候人工設(shè)置那是非常麻煩的,無疑是增加了寫作人的工作量。如果能自動生成章節(jié)索引豈不是節(jié)省了一大堆工作量。本來想通過FireBug看看Fish Li源碼是怎么實現(xiàn)的,但是好像js是加密過的。那我就自己動手了,其實也沒多少代碼,很簡單。
<script language="javascript" type="text/javascript"> //生成目錄索引列表 function GenerateContentList() { var jquery_h3_list = $('#cnblogs_post_body h3');//如果你的章節(jié)標(biāo)題不是h3,只需要將這里的h3換掉即可 if(jquery_h3_list.length>0) { var content = '<a name="_labelTop"></a>'; content += '<div id="navCategory">'; content += '<p style="font-size:18px"><b>閱讀目錄</b></p>'; content += '<ul>'; for(var i =0;i<jquery_h3_list.length;i++) { var go_to_top = '<div style="text-align: right"><a href="#_labelTop" rel="external nofollow" rel="external nofollow" >回到頂部</a><a name="_label' + i + '"></a></div>'; $(jquery_h3_list[i]).before(go_to_top); var li_content = '<li><a href="#_label' + i + '" rel="external nofollow" rel="external nofollow" >' + $(jquery_h3_list[i]).text() + '</a></li>'; content += li_content; } content += '</ul>'; content += '</div>'; if($('#cnblogs_post_body').length != 0 ) { $($('#cnblogs_post_body')[0]).prepend(content); } } } GenerateContentList(); </script>
使用方法:登錄到博客園之后,打開博客園的后臺管理,切換到“設(shè)置”選項卡,將上面的代碼,粘貼到 “頁腳HTML代碼” 區(qū)保存即可。
注意:上述js代碼中提取的h3作為章節(jié)的標(biāo)題,如果你的標(biāo)題不是h3請在代碼注釋的地方自行修改。該代碼除了在文章的最開始生成目錄索引之外,還會在每一個章節(jié)最后右下角(也就是下一個章節(jié)標(biāo)題的右上角)會生成一個“回到頂部”的鏈接,以方便讀者回到目錄。本篇文章的目錄結(jié)構(gòu)就是自動生成的效果,如果你覺得有用,就趕快試用一下吧。
自動生成三級目錄
<script language="javascript" type="text/javascript"> //生成目錄索引列表 function GenerateContentList() { var jquery_h1_list = $('#cnblogs_post_body h1'); if (jquery_h1_list.length == 0) { return; } if ($('#cnblogs_post_body').length == 0) { return; } var content = '<a name="_labelTop"></a>'; content += '<div id="navCategory">'; content += '<p style="font-size:18px"><b>閱讀目錄(Content)</b></p>'; // 一級目錄 start content += '<ul class="first_class_ul">'; for (var i = 0; i < jquery_h1_list.length; i++) { var go_to_top = '<div style="text-align: right"><a href="#_labelTop" rel="external nofollow" rel="external nofollow" >回到頂部(go to top)</a><a name="_label' + i + '"></a></div>'; $(jquery_h1_list[i]).before(go_to_top); // 一級目錄的一條 var li_content = '<li><a href="#_label' + i + '" rel="external nofollow" rel="external nofollow" >' + $(jquery_h1_list[i]).text() + '</a></li>'; var nextH1Index = i + 1; if (nextH1Index == jquery_h1_list.length) { nextH1Index = 0; } var jquery_h2_list = $(jquery_h1_list[i]).nextUntil(jquery_h1_list[nextH1Index], "h2"); // 二級目錄 start if (jquery_h2_list.length > 0) { //li_content +='<ul style="list-style-type:none; text-align: left; margin:2px 2px;">'; li_content += '<ul class="second_class_ul">'; } for (var j = 0; j < jquery_h2_list.length; j++) { var go_to_top2 = '<div style="text-align: right"><a name="_lab2_'+ i + '_' + j + '"></a></div>'; $(jquery_h2_list[j]).before(go_to_top2); // 二級目錄的一條 li_content +='<li><a href="#_lab2_'+ i +'_' + j + '" rel="external nofollow" >' + $(jquery_h2_list[j]).text() + '</a></li>'; var nextH2Index = j + 1; var next; if (nextH2Index == jquery_h2_list.length) { if (i + 1 == jquery_h1_list.length) { next = jquery_h1_list[0]; } else { next = jquery_h1_list[i + 1]; } } else { next = jquery_h2_list[nextH2Index]; } var jquery_h3_list = $(jquery_h2_list[j]).nextUntil(next, "h3"); // 三級目錄 start if (jquery_h3_list.length > 0) { li_content += '<ul class="third_class_ul">'; } for (var k = 0; k < jquery_h3_list.length; k++) { var go_to_third_Content = '<div style="text-align: right"><a name="_label3_' + i + '_' + j + '_' + k + '"></a></div>'; $(jquery_h3_list[k]).before(go_to_third_Content); // 三級目錄的一條 li_content += '<li><a href="#_label3_' + i + '_' + j + '_' + k + '" rel="external nofollow" >' + $(jquery_h3_list[k]).text() + '</a></li>'; } if (jquery_h3_list.length > 0) { li_content += '</ul>'; } li_content += '</li>'; // 三級目錄 end } if (jquery_h2_list.length > 0) { li_content +='</ul>'; } li_content +='</li>'; // 二級目錄 end content += li_content; } // 一級目錄 end content += '</ul>'; content += '</div>'; $($('#cnblogs_post_body')[0]).prepend(content); } GenerateContentList(); </script> levels of contents
如何使用(How to Use)
把上述JS代碼復(fù)制到“頁腳Html代碼”里。
在寫博客的時候,給每個章節(jié)的標(biāo)題設(shè)置“標(biāo)題1”或“標(biāo)題2”或“標(biāo)題3”格式。
然后一切就緒,欣賞效果吧。
示例(Demo)
http://www.dbjr.com.cn/article/186217.htm
腳本之家小編注:為了seo考慮,不建議大量用h1,一個頁面可以存在多個h2,h3,h4,所以腳本之家網(wǎng)站采用的是h2,h3,h4實現(xiàn)三級目錄。
補(bǔ)充:
腳本之家小編從別的地方看到的相關(guān)文章可以當(dāng)個參考
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> * { margin: 0; padding: 0; word-break: break-all; } #toc { width: 200px; position: fixed; left: 0; top: 0; } #toc a.active { color: red; } #content { margin-left: 200px; } </style> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <script> $(document).ready(function () { for (var i = 0; i < 50; ++i) { $(".seg-content").append("<p>一個段落而已</p>") } (function () { var segs = []; $(".seg-begin").each(function (idx, node) { segs.push(node) var link = $("<a></a>").attr("href", "#" + $(node).attr("name")).html($(node).children("h1").html()) if (!idx) { link.addClass("active") } var row = $("<li></li>").append(link) $("#toc ul").append(row) }) $(window).bind("scroll", function() { var scrollTop = $(this).scrollTop() var topSeg = null for (var idx in segs) { var seg = segs[idx] if (seg.offsetTop > scrollTop) { continue } if (!topSeg) { topSeg = seg } else if (seg.offsetTop >= topSeg.offsetTop) { topSeg = seg } } if (topSeg) { $("#toc a").removeClass("active") var link = "#" + $(topSeg).attr("name") console.log('#toc a[href="' + link + '" rel="external nofollow" rel="external nofollow" ]') $('#toc a[href="' + link + '" rel="external nofollow" rel="external nofollow" ]').addClass("active") // console.log($(topSeg).children("h1").text()) } }) })() }) </script> </head> <body> <div id="toc"> <ul> </ul> </div> <div id="content"> <a name="seg-1" class="seg-begin"><h1>第1章節(jié)</h1></a> <div class="seg-content"></div> <a name="seg-2" class="seg-begin"><h1>第2章節(jié)</h1></a> <div class="seg-content"></div> <a name="seg-3" class="seg-begin"><h1>第3章節(jié)</h1></a> <div class="seg-content"></div> <a name="seg-4" class="seg-begin"><h1>第4章節(jié)</h1></a> <div class="seg-content"></div> </div> </body> </html>
具體的使用可以參考下面的文章。
相關(guān)文章
JavaScript實現(xiàn)計數(shù)器基礎(chǔ)方法
這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)計數(shù)器的基礎(chǔ)方法2017-10-10
,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下JS實現(xiàn)兼容各種瀏覽器的高級拖動方法完整實例【測試可用】
這篇文章主要介紹了JS實現(xiàn)兼容各種瀏覽器的高級拖動方法,以完整實例形式分析了JS實現(xiàn)響應(yīng)鼠標(biāo)事件動態(tài)修改頁面元素的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-06-06獲取焦點(diǎn)時,利用js定時器設(shè)定時間執(zhí)行動作
網(wǎng)上有很多類似的知識,并不是有什么難度的技巧,僅僅是開發(fā)過程中的一點(diǎn)點(diǎn)積累而已。2010-04-04