在HTML中,自動編號的標籤是<ol>.
結果如下 :
我喜歡吃的水果有:
- 西瓜
- 蘋果
- 梨
看起來很簡單。其實不然。假設我應邀寫一篇如何賺錢的文章。下面是擬好的提綱。
1. 我們能賺錢嗎
能。
2. 賺錢方法簡介
2.1 當勞工
勤勞致富,大力推薦。
2.2 賣血
2.2.1 賣自己的血
只要撐得住,也是推薦的。
2.2.2 賣別人的血
別人若同意,我也不反對。
2.3 編程
2.3.1 外包
聽說是個賺錢的好方法,但是,你要人家的錢,人家要你的命。
2.3.2 自己承接
最好先在Google上推銷自己。
3. 努力賺錢,作明日之比爾蓋茨
我要養家,要餬口,要當比爾蓋茨!但如果人人這麼想,比爾蓋茨還能成爲比爾蓋茨了嗎?
4. 結論
賺錢真難!
我用<ol>來實現:
其效果如下:
- 我們能賺錢嗎
能。
- 賺錢方法簡介
- 當勞工
勤勞致富,大力推薦。
- 賣血
- 賣自己的血
只要撐得住,也是推薦的。
- 賣別人的血
別人若同意,我也不反對。
- 賣自己的血
- 編程
- 外包
聽說是個賺錢的好方法,但是,你要人家的錢,人家要你的命。
- 自己承接
最好先在Google上推銷自己。
- 外包
- 當勞工
- 努力賺錢,作明日之比爾蓋茨
我要養家,要餬口,要當比爾蓋茨!但如果人人這麼想,比爾蓋茨還能成爲比爾蓋茨了嗎?
- 結論
賺錢真難!
可以看出,無論是從書寫習慣上,還是效果上看,都不能取得較理想的效果。這是爲什麼我們很少看到別人<ol>使用來編排文章的原因。
DocBook中有專門解決此問題之道,主要通過<sect1>、<sect2>......<sect6>來實現。
從結構上來看,比<ol>強賺錢方法簡介多了。但DocBook也有一問題:如果我們要將<sect2>一級上升,除將<sect2>的內容移出<sect1>之外,還必須將<sect2>標籤改爲<sect1>。如果<sect2>又包括了衆多的<sect3>、<sect4>等,則需對這些節一一變更。
下面,我們來實現一個比DocBook還更好用的類似小工具。仿造DocBook的結構,先編寫下面的HTML代碼。
這種結構,我們不必關心各段具體是幾級節點。因此若需重新調整結構,只須調整物理位置即可,無須修改div的class.
我們準備使用JQuery來助力。
因爲Google可以提供JQuery調用,因此只需直接調用其就行了,不必再雖行下載JQuery。爲方便使用,我在下面創建了一個對象。
定義了一個名爲levelIndexManager類變量,此類的接口如下:
getIndex(): 返回各級節點的標籤,如“1.”、“2.3.1”。
levelUp(): 調用此方法,告知levelIndexManager我們需要設置取得下一級節點標籤,levelIndexManager自動在內部設置各級節點標籤,之後使用getIndex()即可返回所需標籤。
levelDown(): 調用此方法,告知levelIndexManager返還上一級節點標籤,之後使用getIndex()即可返回所需標籤。
有時候,我們還需用到levelIndexManager的level屬性,以瞭解當前是第幾級。
爲方便使用,getIndex()方法中在第一次調用時會自動檢查並初始化。
levelIndexManager主要利用JavaScript數組來實現堆棧功能。
關於levelIndexManager,我們僅需瞭解其接口方法就行,不必拘泥於細節。
緊隨着levelIndexManager的定義,編寫以下代碼:
調用JQuery庫後,待頁面加載完畢,調用processChain()函數。此函數是實現本文功能的重點。功能不復雜,對於body之下每個sect,將其sectTitle取出,調用levelIndexManager.getIndex()以獲取正確的節編號後,修改sectTitle的內容。難點在於如何告訴levelIndexManager,何時需要設置下一級節編號。函數的倒數第二行遞歸調用processChain()函數,以處理每個sect之下的子節點。因此,這是調用levelIndexManager.levelUp()的好時機。處理完子節點後,立即調用levelIndexManager.levelDown()返回上一級節點。而對於沒有子節點的,processChain()立即返回。雖然此時levelUp()及levelDown()也被調用了,但沒有關係,只要它們成對被調用,只不過多進行了一次進棧及出棧的動作而已,絲毫不影響節點編號的正確設置。
至此,我們成功地在HTML中實現了比DocBook還更好用的自動編排節標籤的功能,使得我們在使用HTML寫文章時更加便捷。