一般的分页是由后端实现,前端不进行分页,只是负责发送ajax请求获取数据显示。后来发现前端也可以实现分页,网上有很多jquery的分页插件,但具体怎么实现的却不知道,于是就研究了一下前端分页具体实现。
实现分页功能需要了解几个参数
1.totalPage 总页数
2.totalNumber 一共有多少条数据
3.pageSize 每页显示多少条数据
4.currentPage 当前第几页
拓展参数
1.rangeStart 起始页
2.rangeEnd 末页
具体实现代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>js分页</title> <style type="text/css"> body { margin: 0; padding: 0; } .pagination { color: #333; text-align: center; margin: 8px; } .pagination span { color: #999; margin: 0 1px; padding: 3px 6px; border: 1px solid #ccc; } .pagination span.on { background-color: #337ab7; color: #fff; font-weight: bold; border: 1px solid #333; } .pagination a { color: #00f; text-decoration: none; } .pagination a span { border: 1px solid #66c; color: #33f; } #pager { margin: 20px; padding: 4px; } #content { text-align: center; } </style> </head> <body> <div id="pager"></div> <div id="content"></div> <script> var currentPage = 1; // 当前页码, 从1开始 var pageSize = 5; // 每页显示记录数 var maxButtons = 10; // 显示的分页按钮数量 var totalNumber = 30; // 记录总数 var totalPage = parseInt(Math.ceil(totalNumber / pageSize)); // 总页数 initPage(); function initPage() { //循环生成数组 var arr = []; for (var o = 0; o < totalNumber; o++) { arr.push(o); } //每一页第一个li var rangeStartitem = (currentPage - 1) * pageSize; //开始页 var rangeStart = Math.max(1, currentPage - parseInt(maxButtons / 2)); //最后一页 var rangeEnd = Math.min(totalPage, rangeStart + maxButtons - 1); var constr = pageCon(arr, rangeStartitem, pageSize); var divcontent = document.getElementById("content"); divcontent.innerHTML = constr; //创建分页模板 var str = ""; str += "<div class='pagination'>"; str += "当前第" + currentPage + "页" //如果总页数大于1 if (totalPage > 1) { //当前页不是第一页 if (currentPage != 1) { str += '<a href="#!" data-num="1"><span>|<</span></a>'; str += '<a href="#!" data-num="' + (currentPage - 1) + '"><span><<</span></a>'; } else { //如果是第一页,禁用上一页按钮 str += '<span>|<</span>'; str += '<span><<</span>'; } //中间页码 for (var i = rangeStart; i <= rangeEnd; i++) { //如果是当前页的话,就禁用当前页的按钮 if (i == currentPage) { str += '<span class="on">' + i + "</span>"; } else { //否则就可以点击该页 str += '<a href="#" data-num="' + i + '"><span>' + i + "</span></a>"; } } //当前页不是总页,即是最后一页 if (currentPage != totalPage) { str += '<a href="#" data-num="' + (currentPage + 1) + '"><span>>></span></a>'; str += '<a href="#" data-num="' + totalPage + '"><span>>|</span></a>'; } else { //如果是最后页,禁用下一页 str += '<span>>></span>'; str += '<span>>|</span>'; } } str += ' 一共' + totalPage + '页, ' + totalNumber + '条记录 </div>'; var divpager = document.getElementById("pager"); divpager.innerHTML = str; //获取所有生成的页面链接 var listTag = divpager.getElementsByTagName('a'); //绑定li事件 for (var i = 0; i < listTag.length; i++) { listTag[i].onclick = function() { var currentPage = this.getAttribute('data-num'); nowcurrentPage(currentPage); return false; }; } } //传递页面 function nowcurrentPage(currentPage) { this.currentPage = currentPage; initPage(); } //生成每页的数据 function pageCon(arr, rangeStartitem, len) { var constr = ''; for (var i = rangeStartitem; i < rangeStartitem + len; i++) { constr += "<li>"+ arr[i] + "</li>"; } return constr; } </script> </body> </html>
PS:此代码仅用于研究分页功能具体怎么实现。具体请参考Pagination.js插件。
总结:实际的项目中,还是后端进行分页为好,不要使用前端分页,因为前端分页基本是一次性把所有数据获取下来,然后前端才开始进行分页,导致页面性能下降(客户端需要花时间处理),所以建议还是用后端处理分页,前端发送ajax请求获取数据(按需加载)。