前端分页功能的实现以及原理(jQuery)


Posted in Javascript onJanuary 22, 2017

分页场景常见于电商网站,比如说淘宝天猫的评论区,分页功能一般是后台实现,前端请求就完事了。现闲得无聊,就写出来玩玩,只实现功能,并未封装。

基于jq实现分页功能,大致分为以下几步:

  • 定义一个分页方法,可多次调用
  • 参数设置
  • 请求数据页面跳转方法
  • 创建非数字按钮和数据内容区
  • 创建数字按钮
  • 首屏加载
  • 调用

结构层只需要一个容器

<div class="pagination-nick"></div>

一、定义分页方法

function paginationNick(opt){
//code
}

二、参数设置

几个必填的容器class,和几个可以修改的默认数据参数

var pager={
 paginationBox:'',//分页容器-- 必填
 mainBox:'',//内容盒子--必填
 numBtnBox:'',//数字按钮盒子-- 必填
 btnBox:'',//按钮盒子 --必填
 ipt:'',//input class-- 必填
 goBtn:'',//go btn class --必填
 currentBtn:'',//当前按钮class name --必填
 pageCount:5,//每页显示几条数据
 numBtnCount:3,//当前页左右两边各多少个数字按钮
 currentPage:0,//当前页码data-page,首屏默认值
 maxCount:0,//ajax请求数据分成的最大页码
 data:[]//ajax请求的数据
 };
 pager = $.extend(pager,opt);

三、请求数据页面跳转方法

创建所有的按钮时都用了自定义属性data-page保留要跳转的页码信息,调用时将此属性作为参数用于跳转页面判断。

function goPage(btn){
//code
}

obj为ajax请求数据(用于模拟)

var obj={other:{},value:[11,22,33,44,55,66,77,88,99,0,11,22,33,44,55,66,77,88,99,0,11,22,33,44,55,66,77,88,99,0,11,22,33,44,55,66,77,88,99,0]};

将展示的数据赋值给pager.data (array)

pager.data=obj.value;

设置ajax请求数据分成的最大页码

pager.maxCount=pager.data.length % pager.pageCount ? parseInt(pager.data.length / pager.pageCount) +1 :
pager.data.length / pager.pageCount;

设置当前页码

if(!isNaN(btn)){//数字按钮
  pager.currentPage=parseInt(btn);
 }else{
  switch(btn){
  case 'first':
  pager.currentPage=0;
  break;
  case 'prev':
  if(pager.currentPage>0){
  --pager.currentPage;
  }
  break;
  case 'next':
  if(pager.currentPage+1<pager.maxCount){
  ++pager.currentPage;
  }
  break;
  case 'last':
  pager.currentPage=pager.maxCount-1;
  break;
  }
 }

创建数字按钮

createNumBtn(pager.currentPage);

赋值给页码跳转输入框的value,表示当前页码

$('.'+pager.btnBox+' .'+pager.ipt).val(pager.currentPage+1);

内容区填充数据

var arr=[],str='';
 arr=pager.data.slice(pager.pageCount*pager.currentPage,
  pager.data.length - pager.pageCount*(pager.currentPage+1) > -1 ?
  pager.pageCount*(pager.currentPage+1) : pager.data.length);
 arr.forEach(function(v){
  str+='<div>'+v+'</div>';
 });
 $('.'+pager.mainBox).html(str);

四、创建非数字按钮和数据内容区

function createOtherBtn(){
//code
}

内容填充

$('.'+pager.paginationBox).html('<div class="'+pager.btnBox+'"><button data-page="first" class="first-btn">首页</button><button data-page="prev" class="prev-btn">上一页</button><span class="'+pager.numBtnBox+'"></span><button data-page="next" class="next-btn">下一页</button><input type="text" placeholder="请输入页码" class="'+pager.ipt+'"><button class="'+pager.goBtn+'">确定go</button><button data-page="last" class="last-btn">尾页</button></div><div class="'+pager.mainBox+'"></div>');

监听ipt value变化并赋值给go btn data-page

$('.'+pager.btnBox+' .'+pager.ipt).change(function(){
  if(!isNaN($(this).val())){//是数字
  


if($(this).val() > pager.maxCount){//限制value最大值,跳转尾页
  



 $(this).val(pager.maxCount);
  }
  if($(this).val()<1){//限制value最小值,跳转首页
  $(this).val(1);
  }
  }else{//非数字清空value
  $(this).val('');
  }
$('.'+pager.btnBox+' .'+pager.goBtn).attr('data-page',$(this).val() ? $(this).val()-1 : '');
 });

每个btn绑定请求数据页面跳转方法

$('.'+pager.btnBox+' button').each(function(i,v){
 $(this).click(function(){
  //有值且不是上一次的页码时才调用
  if(v.getAttribute('data-page') && v.getAttribute('data-page') != pager.currentPage){
  goPage(v.getAttribute('data-page'));
  }
  });
 });

五、创建数字按钮

function createNumBtn(page){
//code
}

创建数字按钮区

将数字按钮区分成当前页左右2边分析,需要注意的地方都加注释了

var str='';
 if(pager.maxCount>pager.numBtnCount*2){//若最大页码数大于等于固定数字按钮总数(pager.numBtnCount*2+1)时
  //此页左边右边各pager.numBtnCount个数字按钮
  if(page-pager.numBtnCount>-1){//此页左边有pager.numBtnCount页 page页码从0开始
  for(var m=pager.numBtnCount;m>0;m--){
  str+='<button data-page="'+(page-m)+'">'+(page-m+1)+'</button>';
  }
  }else{
  for(var k=0;k<page;k++){
  str+='<button data-page="'+k+'">'+(k+1)+'</button>';
  }
  }
  str+='<button data-page="'+page+'" class="'+pager.currentBtn+'" disabled="disabled">'+(page+1)+'</button>';//此页
  if(pager.maxCount-page>3){//此页右边有pager.numBtnCount页 page页码从0开始
  for(var j=1;j<pager.numBtnCount+1;j++){
  str+='<button data-page="'+(page+j)+'">'+(page+j+1)+'</button>';
  }
  }else{
  for(var i=page+1;i<pager.maxCount;i++){
  str+='<button data-page="'+i+'">'+(i+1)+'</button>';
  }
  }
  /*数字按钮总数小于固定的数字按钮总数pager.numBtnCount*2+1时,
  这个分支,可以省略*/
  if(str.match(/<\/button>/ig).length<pager.numBtnCount*2+1){
 str='';
 if(page<pager.numBtnCount){//此页左边页码少于固定按钮数时
  for(var n=0;n<page;n++){//此页左边
  str+='<button data-page="'+n+'">'+(n+1)+'</button>';
  }
 str+='<button data-page="'+page+'" class="'+pager.currentBtn+'" disabled="disabled">'+(page+1)+'</button>';//此页
  for(var x=1;x<pager.numBtnCount*2+1-page;x++){//此页右边
  
 str+='<button data-page="'+(page+x)+'">'+(page+x+1)+'</button>';
  }
  }
 
if(pager.maxCount-page-1<pager.numBtnCount){
  

for(var y=pager.numBtnCount*2-(pager.maxCount-page-1);y>0;y--){//此页左边
  


str+='<button data-page="'+(page-y)+'">'+(page-y+1)+'</button>';
  }
 str+='<button data-page="'+page+'" class="'+pager.currentBtn+'" disabled="disabled">'+(page+1)+'</button>';//此页
  for(var z=page+1;z<pager.maxCount;z++){//此页右边
  
 str+='<button data-page="'+z+'">'+(z+1)+'</button>';
  }
  }
  }
 }else{
  str='';
  for(var n=0;n<page;n++){//此页左边
  

 str+='<button data-page="'+n+'">'+(n+1)+'</button>';
  }
 str+='<button data-page="'+page+'" class="'+pager.currentBtn+'" disabled="disabled">'+(page+1)+'</button>';//此页
  for(var x=1;x<pager.maxCount-page;x++){//此页右边
  

str+='<button data-page="'+(page+x)+'">'+(page+x+1)+'</button>';
  }
 }
 $('.'+pager.numBtnBox).html(str);

每个btn绑定请求数据页面跳转方法

$('.'+pager.numBtnBox+' button').each(function(i,v){
  $(this).click(function(){
  goPage(v.getAttribute('data-page'));
  });
 });

按钮禁用

$('.'+pager.btnBox+' button').not('.'+pager.currentBtn).attr('disabled',false);
 if(!page){//首页时  

$('.'+pager.btnBox+' .first-btn').attr('disabled',true);
  $('.'+pager.btnBox+' .prev-btn').attr('disabled','disabled');
 }
 if(page==pager.maxCount-1){//尾页时
  


$('.'+pager.btnBox+' .last-btn').attr('disabled',true);
  $('.'+pager.btnBox+' .next-btn').attr('disabled',true);
 }

六、首屏加载

createOtherBtn();//首屏加载一次非数字按钮即可
 goPage();//请求数据页面跳转满足条件按钮点击都执行,首屏默认跳转到currentPage

七、调用

paginationNick({
 paginationBox:'pagination-nick',//分页容器--必填
 mainBox:'main-box-nick',//内容盒子--必填
 numBtnBox:'num-box-nick',//数字按钮盒子-- 必填
 btnBox:'btn-box-nick',//按钮盒子 --必填
 ipt:'page-ipt-nick',//input class-- 必填
 goBtn:'go-btn-nick',//go btn class --必填
 currentBtn:'active-nick'//当前按钮class name --必填
 });

需要注意的地方,注释都加上了!

完整代码:

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>pagination-nick</title>
 <style>
 button{
 padding:5px;
 margin:5px;
 }
 .active-nick{
 color:red;
 }
 input{
 width:50px;
 text-align:center;
 }
 </style>
</head>
<body>
 <div class="pagination-nick"></div>
 <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
 <script>
// 定义一个分页方法,可多次调用
 function paginationNick(opt){
// 参数设置
 var pager={
 paginationBox:'',//分页容器-- 必填
 mainBox:'',//内容盒子--必填
 numBtnBox:'',//数字按钮盒子-- 必填
 btnBox:'',//按钮盒子 --必填
 ipt:'',//input class-- 必填
 goBtn:'',//go btn class --必填
 currentBtn:'',//当前按钮class name --必填
 pageCount:5,//每页显示几条数据
 numBtnCount:3,//当前页左右两边各多少个数字按钮
 currentPage:0,//当前页码data-page,首屏默认值
 maxCount:0,//ajax请求数据分成的最大页码
 data:[]//ajax请求的数据
 };
 pager = $.extend(pager,opt);
 //请求数据页面跳转方法
 function goPage(btn){
 //obj为ajax请求数据
 var obj={other:{},value:[11,22,33,44,55,66,77,88,99,0,11,22,33,44,55,66,77,88,99,0,11,22,33,44,55,66,77,88,99,0,11,22,33,44,55,66,77,88,99,0]};
 //将展示的数据赋值给pager.data (array)
 pager.data=obj.value;
 //设置ajax请求数据分成的最大页码
 pager.maxCount=pager.data.length % pager.pageCount ? parseInt(pager.data.length / pager.pageCount) +1 :
  pager.data.length / pager.pageCount;
// 设置当前页码
 if(!isNaN(btn)){//数字按钮
  pager.currentPage=parseInt(btn);
 }else{
  switch(btn){
  case 'first':
  pager.currentPage=0;
  break;
  case 'prev':
  if(pager.currentPage>0){
  --pager.currentPage;
  }
  break;
  case 'next':
  if(pager.currentPage+1<pager.maxCount){
  ++pager.currentPage;
  }
  break;
  case 'last':
pager.currentPage=pager.maxCount-1;
  break;
  }
 }
 //创建数字按钮
 createNumBtn(pager.currentPage);
 //赋值给页码跳转输入框的value,表示当前页码
 $('.'+pager.btnBox+' .'+pager.ipt).val(pager.currentPage+1);
// 内容区填充数据
 var arr=[],str='';
 arr=pager.data.slice(pager.pageCount*pager.currentPage,
  pager.data.length - pager.pageCount*(pager.currentPage+1) > -1 ?
  pager.pageCount*(pager.currentPage+1) : pager.data.length);
 arr.forEach(function(v){
  str+='<div>'+v+'</div>';
 });
 $('.'+pager.mainBox).html(str);
 }
 //创建非数字按钮和数据内容区
 function createOtherBtn(){
 $('.'+pager.paginationBox).html('<div class="'+pager.btnBox+'"><button data-page="first" class="first-btn">首页</button><button data-page="prev" class="prev-btn">上一页</button><span class="'+pager.numBtnBox+'"></span><button data-page="next" class="next-btn">下一页</button><input type="text" placeholder="请输入页码" class="'+pager.ipt+'"><button class="'+pager.goBtn+'">确定go</button><button data-page="last" class="last-btn">尾页</button></div><div class="'+pager.mainBox+'"></div>');
 //ipt value变化并赋值给go btn data-page
$('.'+pager.btnBox+' .'+pager.ipt).change(function(){
  if(!isNaN($(this).val())){//是数字
  if($(this).val() > pager.maxCount){//限制value最大值,跳转尾页
  $(this).val(pager.maxCount);
  }
  if($(this).val()<1){//限制value最小值,跳转首页
  $(this).val(1);
  }
  }else{//非数字清空value
  $(this).val('');
  }
$('.'+pager.btnBox+' .'+pager.goBtn).attr('data-page',$(this).val() ? $(this).val()-1 : '');
 });
 //每个btn绑定请求数据页面跳转方法
 $('.'+pager.btnBox+' button').each(function(i,v){
  $(this).click(function(){
  //有值且不是上一次的页码时才调用
  if(v.getAttribute('data-page') && v.getAttribute('data-page') != pager.currentPage){
  goPage(v.getAttribute('data-page'));
  }
  });
 });
 }
 //创建数字按钮
 function createNumBtn(page){
 //page是页面index从0开始,这里的page加减一要注意
 var str='';
 if(pager.maxCount>pager.numBtnCount*2){//若最大页码数大于等于固定数字按钮总数(pager.numBtnCount*2+1)时
  //此页左边右边各pager.numBtnCount个数字按钮
  if(page-pager.numBtnCount>-1){//此页左边有pager.numBtnCount页 page页码从0开始
  for(var m=pager.numBtnCount;m>0;m--){
  str+='<button data-page="'+(page-m)+'">'+(page-m+1)+'</button>';
  }
  }else{
  for(var k=0;k<page;k++){
  str+='<button data-page="'+k+'">'+(k+1)+'</button>';
  }
  }
  str+='<button data-page="'+page+'" class="'+pager.currentBtn+'" disabled="disabled">'+(page+1)+'</button>';//此页
  if(pager.maxCount-page>3){//此页右边有pager.numBtnCount页 page页码从0开始
  for(var j=1;j<pager.numBtnCount+1;j++){
  str+='<button data-page="'+(page+j)+'">'+(page+j+1)+'</button>';
  }
  }else{
  for(var i=page+1;i<pager.maxCount;i++){
  str+='<button data-page="'+i+'">'+(i+1)+'</button>';
  }
  }
  /*数字按钮总数小于固定的数字按钮总数pager.numBtnCount*2+1时,
  这个分支,可以省略*/
  if(str.match(/<\/button>/ig).length<pager.numBtnCount*2+1){
  str='';
  if(page<pager.numBtnCount){//此页左边页码少于固定按钮数时
  for(var n=0;n<page;n++){//此页左边
  str+='<button data-page="'+n+'">'+(n+1)+'</button>';
  }
  str+='<button data-page="'+page+'" class="'+pager.currentBtn+'" disabled="disabled">'+(page+1)+'</button>';//此页
  for(var x=1;x<pager.numBtnCount*2+1-page;x++){//此页右边
  str+='<button data-page="'+(page+x)+'">'+(page+x+1)+'</button>';
  }
  }
  if(pager.maxCount-page-1<pager.numBtnCount){
  for(var y=pager.numBtnCount*2-(pager.maxCount-page-1);y>0;y--){//此页左边
  str+='<button data-page="'+(page-y)+'">'+(page-y+1)+'</button>';
  }
  str+='<button data-page="'+page+'" class="'+pager.currentBtn+'" disabled="disabled">'+(page+1)+'</button>';//此页
  for(var z=page+1;z<pager.maxCount;z++){//此页右边
  str+='<button data-page="'+z+'">'+(z+1)+'</button>';
  }
  }
  }
 }else{
  str='';
  for(var n=0;n<page;n++){//此页左边
  str+='<button data-page="'+n+'">'+(n+1)+'</button>';
  }
  str+='<button data-page="'+page+'" class="'+pager.currentBtn+'" disabled="disabled">'+(page+1)+'</button>';//此页
  for(var x=1;x<pager.maxCount-page;x++){//此页右边
  str+='<button data-page="'+(page+x)+'">'+(page+x+1)+'</button>';
  }
 }
 $('.'+pager.numBtnBox).html(str);

 //每个btn绑定请求数据页面跳转方法
 $('.'+pager.numBtnBox+' button').each(function(i,v){
  $(this).click(function(){
  goPage(v.getAttribute('data-page'));
  });
 });
 //按钮禁用
 $('.'+pager.btnBox+' button').not('.'+pager.currentBtn).attr('disabled',false);
 if(!page){//首页时
  $('.'+pager.btnBox+' .first-btn').attr('disabled',true);
  $('.'+pager.btnBox+' .prev-btn').attr('disabled','disabled');
 }
 if(page==pager.maxCount-1){//尾页时
  $('.'+pager.btnBox+' .last-btn').attr('disabled',true);
  $('.'+pager.btnBox+' .next-btn').attr('disabled',true);
 }
 }
 //首屏加载
 createOtherBtn();//首屏加载一次非数字按钮即可
 goPage();//请求数据页面跳转满足条件按钮点击都执行,首屏默认跳转到currentPage
 }
 //调用
 paginationNick({
 paginationBox:'pagination-nick',//分页容器--必填
 mainBox:'main-box-nick',//内容盒子--必填
 numBtnBox:'num-box-nick',//数字按钮盒子-- 必填
 btnBox:'btn-box-nick',//按钮盒子 --必填
 ipt:'page-ipt-nick',//input class-- 必填
 goBtn:'go-btn-nick',//go btn class --必填
 currentBtn:'active-nick'//当前按钮class name --必填
 });
 </script>
</body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js prototype 格式化数字 By shawl.qiu
Apr 02 Javascript
js 匿名调用实现代码
Jun 19 Javascript
解析JavaScript中点号“.”的多义性
Dec 02 Javascript
js 限制input只能输入数字、字母和汉字等等
Dec 18 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
Feb 18 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
Aug 07 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
Nov 23 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
Apr 28 Javascript
手动初始化Angular的模块与控制器
Dec 26 Javascript
vue实现百度搜索下拉提示功能实例
Jun 14 Javascript
详解js中Array的方法及技巧
Sep 12 Javascript
node.js文件的复制、创建文件夹等相关操作
Feb 05 Javascript
JavaScript 事件对内存和性能的影响
Jan 22 #Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
Jan 22 #Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
Jan 22 #Javascript
JavaScript 详解预编译原理
Jan 22 #Javascript
JavaScript中匿名函数的递归调用
Jan 22 #Javascript
Javascript中字符串和数字的操作方法整理
Jan 22 #Javascript
loading动画特效小结
Jan 22 #Javascript
You might like
业余方法DIY电子管FM收音机
2021/03/02 无线电
PHP XML数据解析代码
2010/05/26 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
jsTree使用记录实例
2016/12/01 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
python中如何写类
2020/06/29 Python
python如何删除列为空的行
2020/07/17 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
室内设计实习自我鉴定
2013/09/25 职场文书
清洁工表扬信
2014/01/08 职场文书
助理政工师申报材料
2014/06/03 职场文书
离婚协议书范文
2015/01/26 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书