页面中经常会使用列表显示查询结果,并可以使用JavaScript代码很方便地实现分页浏览功能,下面先来看完整的实现代码。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style> #result { min-height:300px; } .list_res { list-style-type: square; } .list_res li a{ color: navy; font-size: 1.1em; } .listPageNavi { text-align: center; margin-top: 2em; } .listPageNavi a { font-size: 0.9em; margin-left: 0.5em; margin-right: 0.5em; } </style> </head> <body> <div id="result"></div> </body> </html> <script src="/js/ajax.js"></script> <script> // 每页多少行 let listRowPerPage = 3; // 当前页 let listCurPage = 1; // 初始化 function listPageInit(id) { let lst = document.getElementById(id); if (lst === undefined) return false; let lstItems = listGetItems(id); if (lstItems === null || lstItems.length === 0) return false; // 显示页导航 let s = Array("<div class='listPageNavi'>"); // 首页 s.push(`<a href="javascript:listShowPage('${id}',1);">首页</a>`); // 上一页 s.push(`<a href="javascript:listPreviousPage('${id}');">上一页</a>`); // 下一页 s.push(`<a href="javascript:listNextPage('${id}');">下一页</a>`); // 末页 s.push(`<a href="javascript:listLastPage('${id}');">末页</a>`); // s.push("</div>"); // 导航添加到列表后 lst.parentNode.innerHTML += s.join(""); // 显示第一页 listShowPage("list1", 1); return true; } // 返回列表项集合 function listGetItems(id) { let lst = document.getElementById(id); return lst.getElementsByTagName("li"); } // 总页数 function listPageCount(id) { let lstItems = listGetItems(id); let pageCount = Math.floor(lstItems.length / listRowPerPage); if (lstItems.length % listRowPerPage !== 0) pageCount++; return pageCount; } // 显示指定页 function listShowPage(id, page) { let lstItems = listGetItems(id); let min = (page - 1) * listRowPerPage; let max = min + listRowPerPage; if (max > lstItems.length) max = lstItems.length; // 记录当前页 listCurPage = page; // for (let i = 0; i < min; i++) lstItems[i].style.display = "none"; for (let i = min; i < max; i++) lstItems[i].style.display = "list-item"; for (let i = max; i < lstItems.length; i++) lstItems[i].style.display = "none"; } // 显示上一页 function listPreviousPage(id) { let nextPage = listCurPage - 1; if (nextPage < 1) nextPage = 1; listShowPage(id, nextPage); } // 显示下一页 function listNextPage(id) { let pageCount = listPageCount(id); let nextPage = listCurPage + 1; if (nextPage > pageCount) nextPage = pageCount; listShowPage(id, nextPage); } // 显示末页 function listLastPage(id) { let pageCount = listPageCount(id); listShowPage(id, pageCount); } // // 读取列表并初始化 new Ajax("list.html").getText(function (txt) { document.getElementById("result").innerHTML = txt; // 列表分页初始化 listPageInit("list1"); }); </script>
页面中,style元素定义了一些必要的CSS样式,id为"result"的div元素用于显示列表及分页浏览导航。下面着重来看JavaScript代码部分。
JavaScript代码中,首先定义了两个变量,分别是:
listPageInit(id)函数,用于分页浏览的初始化,参数需要指定列表元素的id属性值。函数中,首先会对列表元素和列表项进行检查;然后,使用HTML代码创建导航栏,分别使用a元素创建了显示首页、上一页、下一页和末页的导航链接。初始化成功时会显示第一页,并返回true;否则返回false。
listGetItems(id)函数,用于获取列表项集合,参数指定列表元素的id属性值。函数会返回列表对象中的所有li元素集合。
listPageCount(id)函数,计算总页数,参数指定列表元素的id属性值。函数会计算列表项按listRowPerPage数值分页共有多少页。
listShowPage(id, page)函数,显示指定的页。参数一指定列表元素的id属性值,参数二指定显示第几页。函数中,会按列表项集合的索引进行分页处理,显示的列表项使用li元素的默认显示(display)属性list-item,不显示的列表项则设置为none。
listPreviousPage(id)函数,显示上一页,参数指定列表元素的id属性值。函数中会通过当前页减1计算上一页的页码,如果小于1则显示第一页。
listNextPage(id)函数,显示下一页,参数指定列表元素的id属性值。函数中通过当前页加1计算下一页的页码,如果大于总页数则显示最后一页。
listLastPage(id)函数,显示最后一页,参数指定列表元素的id属性值。
在这些函数中,只有listPageInit(id)需要直接调用,此函数中对列表的元素进行了必要的检查,其它函数都会在代码中自动调用,所以不需要对列表元素进行重复检查。
代码的最后,模拟从服务器获取查询结果,使用Ajax类读取了页面相同目录下list.html文件中的列表代码,其内容如下:
<ul id='list1' class='list_res'> <li><a href='/article/Article.aspx?id=a251000' target='_blank'>Excel与数据处理——概述</a></li> <li><a href='/article/Article.aspx?id=a251001' target='_blank'>Excel和二维表结构</a></li> <li><a href='/article/Article.aspx?id=a251002' target='_blank'>小小单元格有大学问</a></li> <li><a href='/article/Article.aspx?id=a251003' target='_blank'>区域</a></li> <li><a href='/article/Article.aspx?id=a251004' target='_blank'>公式与函数</a></li> <li><a href='/article/Article.aspx?id=a251005' target='_blank'>数字与计算</a></li> <li><a href='/article/Article.aspx?id=a251006' target='_blank'>文本</a></li> <li><a href='/article/Article.aspx?id=a251007' target='_blank'>长数字、前导0与自动填充</a></li> <li><a href='/article/Article.aspx?id=a251008' target='_blank'>日期与时间</a></li> <li><a href='/article/Article.aspx?id=a251009' target='_blank'>逻辑运算与条件判断</a></li> </ul>
请注意,列表元素的id属性为list1,在调用列表分页浏览相关函数时需要使用这个属性值。如果想简化代码,也可以将这个列表复制到id为result的div元素中直接进行测试,并将Ajax类的调用直接使用listPageInit("list1");代码替换。
在Ajax对象中,成功读取列表数据后,调用showPageInit("list1")函数进行初始化,并显示第一页的内容,显示效果如下图所示。
本文通过JavaScript代码实现了列表分页浏览的基本功能,实际应用中可以根据需要进行扩展。对于list系列变量和函数,可以保存到单独的.js文件,以便在其它页面中重复使用。此外,listRowPerPage和listCurPage变量定义为全局变量,所以,在一个页面中只能支持一个列表的分页浏览,如果页面中有多个列表需要分页浏览(虽然这样的设计并不多见),可以将这两个数据使用input字段(type属性设置为hidden)保存到对应的导航栏中,并使用类似"列表id+RowPerPage"、"列表id+CurPage"这样的格式命名,在其它函数中使用这两个数据时,可以使用document.getElementById()方法读取。如果需要在初始化时设置每页显示多少行数据,也可以在listPageInit()函数中添加第二个参数,并将设置的数据保存到listRowPerPage变量或隐藏的input字段中。