博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原生js版分页插件
阅读量:4584 次
发布时间:2019-06-09

本文共 10146 字,大约阅读时间需要 33 分钟。

之前我在自己的博客里发表了一篇用angularJs自定义指令实现的分页插件,今天简单改造了一下,改成了原生JavaScript版本的分页插件,可以自定义一些简单配置,特此记录下来。如有不足之处,欢迎指出。

本插件可以自定义的功能:

  1. 可初始化每页条数,以及重新选择每页条数

  2.自定义首末页、上下页按钮的显示内容(是:<<、  >>、  < 、  >    还是:首页、末页、上一页、下一页)

  3.设置当前页在一定范围时,是否显示省略号按钮

  4.自定义当前页按钮与省略号按钮之间显示的数字按钮的个数

需要设置的参数如下:

  pageSize: 10,           //每页条数(不设置时,默认为10)

  prevPage: '上页',      //上一页按钮显示内容(不设置时,默认为:<)
  nextPage: '下页',      //下一页按钮显示内容(不设置时,默认为:>)
  firstPage: '首页',      //首页按钮显示内容(不设置时,默认为:<<)
  lastPage: '末页',       //末页按钮显示内容(不设置时,默认为:>>)
  degeCount: 4,         //当前页前后两边可显示的页码个数(不设置时,默认为3)
  ellipsis: true            //是否显示省略号按钮(不可点击)(true:显示,false:不显示,不设置时,默认为显示)

 这些设置项只需要在页面加载时定义一个js对象,设置相应的参数,在创建Paging实例时,传入该对象即可。当然也可以不定义该参数对象,则在创建Paging实例时,需传入空对象,此时就是默认设置

由于本案例用ajax调用的接口是真实接口,返回的都是真实数据,所以在本博客的代码中,我会把调用的接口地址和相关的请求头信息隐藏。

自己实现的简单小插件,把分页部分的css样式写在了插件paging.js中,以动态创建style标签的方式,加入到页面中。

1、代码部分:

1.1、插件 - paging.js

分页的css样式写在插件中,动态创建style标签,加载到页面中。在该js中有一个Paging构造函数。在构造函数中有两个参数,第一个是自定义分页参数的js对象,第二个是回调函数。

在构造函数中有一个initPage()方法。用来渲染分页DOM结构。页码点击事件和选择每页条数的事件都写在构造函数中,目前这样感觉确实不好,后续再改进。

代码如下:

 

var tableStyle =    ".page {font-size: 14px;background-color: transparent;width: 100%;height: 50px;line-height: 50px;display: none;}"+    ".page .page-l select {width: 60px;height: 30px;}"+    ".page .page-l .page-size-box {display: inline-block;margin-left: 20px;}"+    ".page .page-r {float: right;padding-top: 10px;}"+    ".page .page-r ul {float: left;list-style: none;margin: 0;height: 30px;box-sizing: border-box;padding: 0;}"+    ".page .page-r ul li {float: left;list-style: none;height: 100%;line-height: 30px;border: 1px solid #ccc;border-right: 0 none;box-sizing: border-box;}"+    ".page .page-r ul li a:hover {background-color: #f5f2f2;}"+    ".page .page-r ul li:last-child {border-right: 1px solid #ccc;}"+    ".page .page-r ul li a {text-decoration: none;display: block;height: 100%;padding:0 10px; color: #777;}"+    ".page .page-r ul li a.active {background-color: #09aeb0;color: #fff;}"+    ".page .page-r ul li span {display: block;height: 100%;padding:0 10px;color: #ccc;cursor: not-allowed;}"+    ".page .page-r ul li span.ellipsis {cursor: default;}";var styleNode = document.createElement('style');styleNode.innerHTML = tableStyle;var headNode = document.getElementsByTagName('head')[0];headNode.appendChild(styleNode);function Paging(paramsObj, callback) {    this.pageSize = paramsObj.pageSize || 10;    //每页条数(不设置时,默认为10    this.pageIndex = paramsObj.pageIndex || 1;    //当前页码    this.totalCount = paramsObj.totalCount || 0;   //总记录数    this.totalPage = Math.ceil(paramsObj.totalCount / paramsObj.pageSize) || 0;     //总页数    this.prevPage = paramsObj.prevPage || '<';     //上一页(不设置时,默认为:<)    this.nextPage = paramsObj.nextPage || '>';     //下一页(不设置时,默认为:>)    this.firstPage = paramsObj.firstPage || '<<';     //首页(不设置时,默认为:<<)    this.lastPage = paramsObj.lastPage || '>>';     //末页(不设置时,默认为:>>)    this.degeCount = paramsObj.degeCount || 3;             //当前页前后两边可显示的页码个数(不设置时,默认为3)    this.ellipsis = paramsObj.ellipsis; //是否显示省略号不可点击按钮(true:显示,false:不显示)    this.ellipsisBtn = (paramsObj.ellipsis == true || paramsObj.ellipsis == null) ? '
  • ' : ''; var that = this; $('#page_size').val(this.pageSize); callback && callback(this.pageIndex, this.pageSize); //立即执行回调函数 // 生成分页DOM结构 this.initPage = function (totalCount, totalPage, pageIndex) { this.totalCount = totalCount; this.totalPage = totalPage; this.pageIndex = pageIndex; var degeCount = this.degeCount; var pageHtml = ''; //总的DOM结构 var tmpHtmlPrev = ''; //省略号按钮前面的DOM var tmpHtmlNext = ''; //省略号按钮后面的DOM var headHtml = ''; //首页和上一页按钮的DOM var endHtml = ''; //末页和下一页按钮的DOM if(pageIndex - degeCount >= degeCount-1 && totalPage - pageIndex >= degeCount+1){ //前后都需要省略号按钮 headHtml = '
  • '+this.firstPage+'
  • '+ '
  • '+this.prevPage+'
  • '; endHtml = '
  • '+this.nextPage+'
  • '+ '
  • '+this.lastPage+'
  • '; var count = degeCount; //前后各自需要显示的页码个数 for(var i=0; i
    '; } tmpHtmlNext += '
  • '+((pageIndex-0)+i+1)+'
  • '; } pageHtml = headHtml + this.ellipsisBtn + tmpHtmlPrev + '
  • '+pageIndex+'
  • '+ tmpHtmlNext + this.ellipsisBtn + endHtml; }else if(pageIndex - degeCount >= degeCount-1 && totalPage - pageIndex < degeCount+1) { //前面需要省略号按钮,后面不需要 headHtml = '
  • '+this.firstPage+'
  • '+ '
  • '+this.prevPage+'
  • '; if(pageIndex == totalPage){ //如果当前页就是最后一页 endHtml = '
  • '+this.nextPage+'
  • '+ '
  • '+this.lastPage+'
  • '; }else{ //当前页不是最后一页 endHtml = '
  • '+this.nextPage+'
  • '+ '
  • '+this.lastPage+'
  • '; } var count = degeCount; //前需要显示的页码个数 var countNext = totalPage - pageIndex; //后需要显示的页码个数 if(pageIndex != 1){ for(var i=0; i
    '; } } for(var i=0; i
    '; } pageHtml = headHtml + this.ellipsisBtn + tmpHtmlPrev + '
  • '+pageIndex+'
  • '+ tmpHtmlNext + endHtml; }else if(pageIndex - degeCount < degeCount-1 && totalPage - pageIndex >= degeCount+1){ //前面不需要,后面需要省略号按钮 if(pageIndex == 1){ //如果当前页就是第一页 headHtml = '
  • '+this.firstPage+'
  • '+ '
  • '+this.prevPage+'
  • '; }else{ //当前页不是第一页 headHtml = '
  • '+this.firstPage+'
  • '+ '
  • '+this.prevPage+'
  • '; } endHtml = '
  • '+this.nextPage+'
  • '+ '
  • '+this.lastPage+'
  • '; var countPrev = pageIndex - 1; //前需要显示的页码个数 var count = degeCount; //后需要显示的页码个数 if(pageIndex != 1){ for(var i=0; i
    '; } } for(var i=0; i
    '; } pageHtml = headHtml + tmpHtmlPrev + '
  • '+pageIndex+'
  • '+ tmpHtmlNext + this.ellipsisBtn + endHtml; }else if(pageIndex - degeCount < degeCount-1 && totalPage - pageIndex < degeCount+1){ //前后都不需要省略号按钮 headHtml = '
  • '+this.firstPage+'
  • '+ '
  • '+this.prevPage+'
  • '; endHtml = '
  • '+this.nextPage+'
  • '+ '
  • '+this.lastPage+'
  • '; if(totalPage == 1){ //如果总页数就为1 headHtml = '
  • '+this.firstPage+'
  • '+ '
  • '+this.prevPage+'
  • '; endHtml = '
  • '+this.nextPage+'
  • '+ '
  • '+this.lastPage+'
  • '; }else{ if(pageIndex == 1){ //如果当前页就是第一页 headHtml = '
  • '+this.firstPage+'
  • '+ '
  • '+this.prevPage+'
  • '; endHtml = '
  • '+this.nextPage+'
  • '+ '
  • '+this.lastPage+'
  • '; }else if(pageIndex == totalPage){ //如果当前页是最后一页 headHtml = '
  • '+this.firstPage+'
  • '+ '
  • '+this.prevPage+'
  • '; endHtml = '
  • '+this.nextPage+'
  • '+ '
  • '+this.lastPage+'
  • '; } } var countPrev = pageIndex - 1; //前需要显示的页码个数 var countNext = totalPage - pageIndex; //后需要显示的页码个数 if(pageIndex != 1){ for(var i=0; i
    '; } } for(var i=0; i
    '; } pageHtml = headHtml + tmpHtmlPrev + '
  • '+pageIndex+'
  • '+ tmpHtmlNext + endHtml; } $('#page_ul').html(pageHtml); $('#total_count').html(totalCount); }; // 点击页码(首页、上一页、下一页、末页、数字页) $('#page_ul').on('click','a',function (e) { var _this = $(this); var idAttr = _this.attr('id'); var className = _this.attr('class'); if(idAttr == 'first_page'){ //如果是点击的首页 that.pageIndex = 1; }else if(idAttr == 'prev_page'){ //如果点击的是上一页 that.pageIndex = that.pageIndex == 1 ? that.pageIndex : that.pageIndex - 1 ; }else if(idAttr == 'next_page'){ //如果点击的是下一页 that.pageIndex = that.pageIndex == that.totalPage ? that.pageIndex : parseInt(that.pageIndex) + 1; }else if(idAttr == 'last_page'){ //如果点击的是末页 that.pageIndex = that.totalPage; }else if(className == 'page-number'){ //如果点击的是数字页码 that.pageIndex = _this.html(); } callback && callback(that.pageIndex, that.pageSize); }); // 改变每页条数 $('#page_size').change(function () { var _this = $(this); that.pageIndex = paramsObj.pageIndex = 1; that.pageSize = paramsObj.pageSize = _this.val() - 0; callback && callback(that.pageIndex, that.pageSize); })}

     

     

    1.2、index.html

    只需要在创建Paging实例的时候,传入设置项的js对象,然后在回调函数里发送ajax请求获取数据。回调函数里需要传入两个形参,依次是当前页码和每页条数。ajax请求的成功回调里根据接口返回的总条数,结合每页条数计算出总页数。再调用Paging实例的initPage()方法,传入总条数、总页数和当前页码,即可渲染出分页的DOM结构了。

    代码如下:

        
    js版分页插件
    序号 用户ID 姓名 创建时间
    未查询到数据
    总共
    每页显示

       

      2、效果

      当前显示第一页时,首页和上页按钮不可点击,鼠标移上去时,也会显示不可点击的状态

       

      由于初始化的degeCount参数为4,ellipsis参数为true,所以当当前页在一定范围时,会出现省略号按钮,在当前页按钮的两边会显示4个可点击的按钮

       

       

      如果当前页是最后一页,则末页和下页的按钮不可点击,鼠标移上去时,会显示不可点击的状态

       

      当修改每页显示条数时,会自动重新查询数据,默认显示第一页

       

       

      当查询结果的总页数为1的时候,则首页、上页、下页、末页四个按钮均不可点击

       

      转载于:https://www.cnblogs.com/libo0125ok/p/7815597.html

      你可能感兴趣的文章
      定时调动 (项目保留备份代码码)
      查看>>
      Leetcode-Divide Two Integers
      查看>>
      HTML 首页倒三角形导航块
      查看>>
      每天一道Java题[9]
      查看>>
      结对编程2——单元测试
      查看>>
      python 函数/列表的应用
      查看>>
      C#与MES
      查看>>
      LR接口测试---Java Vuser之jdbc查询(调试前)
      查看>>
      SQL Server 各版本安装包分享
      查看>>
      .net项目移植后的虚拟目录的配置问题
      查看>>
      JSP页面中引入另一个JSP页面
      查看>>
      Android笔记——活动的生命周期
      查看>>
      springmvc使用包装的pojo接收商品信息的查询条件
      查看>>
      【Linux】【Services】【Configuration】puppet
      查看>>
      poj 1002:487-3279(水题,提高题 / hash)
      查看>>
      RAC环境上搭建DG
      查看>>
      OS X Mountain Lion高手进阶
      查看>>
      精通CSS:高级Web标准解决方案(第2版)(Amazon第一CSS畅销书全新改版)
      查看>>
      初识电流环
      查看>>
      MySQL每天自动增加分区
      查看>>