jQuery-生成目录

时间:2020-01-09 10:47:14  来源:igfitidea点击:

本教程将根据HTML页面中的标题(" h1"至" h3"元素)展示如何使用jQuery在HTML页面内生成目录。

假设我们有一个使用标题HTML标签<h1>,<h2>和<h3>的带有标题的HTML页面。还要想象一下,我们需要为此页面生成一个内部目录。

<h1>元素包含页面标题,因此我们实际上并不希望将其作为内部目录的一部分。我们只希望目录在页面中包含<h2>,<h3>元素。

这是上面提到的HTML页面的示例:

<html>

<head>
<script type="text/javascript"
    src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js">
</script>
</head>

<body>

<h1>Title</h1>

<div id="tocDiv">
<ul id="tocList">

</ul>
</div>

<h2>Chapter 1</h2>
<h3>Section 1.1</h3>
<h2>Chapter 2</h2>
<h3>Section 2.1</h3>
<h2>Chapter 3</h2>
<h3>Section 3.1</h3>
<h3>Section 3.2</h3>

<script>
$(document).ready(function() {

});
</script>

</body>

</html>

注意id为" tocDiv"的div,以及ID为" tocList"的" ul"。我们希望目录位于内部的ul元素内,就像里面带有嵌套ulli元素的li元素一样。

还要注意传递给$(document).ready()函数的空函数。在此函数内部,我们将放置生成目录的代码。

" h2"和" h3"元素的列表是我们要在目录中列出的内容。 " h2"和" h3"元素的主体内容,即加上指向" h2"或者" h3"元素所在位置的链接。

目录jQuery代码

这是生成目录的代码:

$(document).ready(function() {                                                                          
    $(tocList).empty();                                                            
    
    var prevH2Item = null;                                                            
    var prevH2List = null;                                                            
    
    var index = 0;                                                                    
    $("h2, h3").each(function() {                                                     
    
        //insert an anchor to jump to, from the TOC link.            
        var anchor = "<a name='" + index + "'></a>";                 
        $(this).before(anchor);                                     
        
        var li     = "<li><a href='#" + index + "'>" + $(this).text() + "</a></li>"; 
        
        if( $(this).is("h2") ){                                     
            prevH2List = $("<ul></ul>");                
            prevH2Item = $(li);                                     
            prevH2Item.append(prevH2List);                          
            prevH2Item.appendTo("#tocList");                        
        } else {                                                    
            prevH2List.append(li);                                  
        }                                                           
        index++;                                                    
    });                                                             
    
});

这段代码使用jQuery调用$(" h2,h3")。each(...)遍历所有h2h3元素。

对于每个" h2"或者" h3"元素,在HTML文档之前的<a name="index"> </a>中会插入一个<a name="index"> </a>。这是必需的,以便目录中的链接可以跳至相应的" h2"或者" h3"元素。插入的索引变量从0开始递增。

h2和h3元素都有一个li元素,创建该li元素以将链接保留在目录中。 " h2"元素还创建了一个内部ul元素,该元素将保存在此元素与下一个" h2"元素之间的" h3"元素。这就是h3元素嵌套在最新的h2元素之前的方式。

将上面的代码插入到前面显示的HTML页面中,将在页面顶部生成以下目录:

  • 第一章1.1节
  • 第2章2.1节
  • 第三章3.1节
  • 第3.2节

创建目录jQuery插件

让我们尝试将目录代码表转换为jQuery插件。然后,我们将看到如何将实际示例转换为jQuery插件。我的《 jQuery插件教程》介绍了如何创建jQuery插件,因此在此不再赘述。

首先,将$(document).ready(...)函数调用中的代码移到其自己的函数中。现在,<script>元素中的代码如下所示:

$(document).ready(function() {                                                                          
    tableOfContents("#tocList");
});

function tableOfContents(tocList) {                                                                            
    $(tocList).empty();
    var prevH2Item = null;
    var prevH2List = null;
    var index = 0;

    $("h2, h3").each(function() {
        //insert an anchor to jump to, from the TOC link.
        var anchor = "<a name='" + index + "'></a>";
        $(this).before(anchor);
    
        var li     = "<li><a href='#" + index + "'>" +
                     $(this).text() + "</a></li>";
    
        if( $(this).is("h2") ){
            prevH2List = $("<ul></ul>");
            prevH2Item = $(li);
            prevH2Item.append(prevH2List);
            prevH2Item.appendTo(tocList);
        } else {
            prevH2List.append(li);
        }
        index++;
    });
}

由于所有代码都适合单个函数,因此自然适合单个函数jQuery插件。这是jQuery插件代码的外观:

jQuery.tableOfContents =                                                                   
function (tocList) {                                                                   
    jQuery(tocList).empty();                                                            
    var prevH2Item = null;                                                             
    var prevH2List = null;                                                             
    
    var index = 0;                                                                     
    jQuery("h2, h3").each(function() {                                                      
    
        var anchor = "<a name='" + index + "'></a>";                                   
        jQuery(this).before(anchor);                                                        
        
        var li     = "<li><a href='#" + index + "'>" + 
                     jQuery(this).text() + "</a></li>";   
        
        if( jQuery(this).is("h2") ){                                                        
            prevH2List = jQuery("<ul></ul>");                                               
            prevH2Item = jQuery(li);                                                        
            prevH2Item.append(prevH2List);                                             
            prevH2Item.appendTo(tocList);                                              
        } else {                                                                       
            prevH2List.append(li);                                                     
        }                                                                              
        index++;                                                                       
    });                                                                                
}

这段代码应该放在名为jQuery.tocPlugin.js的文件中。

注意,现在如何将$()函数的所有用法替换为jQuery()函数。创建jQuery插件时,应始终使用jQuery()函数。

jQuery插件现在可以像这样使用:

<html>                  

<head>
<script type="text/javascript" 
      src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"> 
</script>                                                           

<script type="text/javascript"
      src="jquery.tocPlugin.js">
</script>

</head>                                                                         

<body>                                                                          

<div id="tocDiv">                                                           
<ul id="tocList">                                                       

</ul>                                                                   
</div>                                                                      

<h2>Chapter 1</h2>                                                    
<h3>Section 1.1</h3>                                                  
<h2>Chapter 2</h2>                                                    
<h3>Section 2.1</h3>                                                  
<h2>Chapter 3</h2>                                                    
<h3>Section 3.1</h3>                                                  
<h3>Section 3.2</h3>                                                  

<script>                                                                        
$(document).ready(function() {                                            
    jQuery.tableOfContents("#tocList"); 
});                                                                       
</script>                                                                       

</body>                                                                         

</html>

用粗体标记的代码是HTML页面中要更改的内容,以便使用目录插件。