从零开始做一个pagination分页组件


Posted in Javascript onMarch 15, 2017

开始一个组件,毫无目的的写代码是一个不好的习惯,要经历 分析 => 抽象 => 实现 => 应用 四个阶段。

组件DEMO地址:https://github.com/CaptainLiao/zujian/tree/master/pagination

分析需求

当前页码显示前后三页,以及在两端显示上一页、下一页

未显示的地方用 ‘...'代替

举个栗子:

假设总共有30页

当前为第一页:1 2 3 4 ... 30 下一页

当前为第二页:上一页 1 2 3 4 5 ... 30 下一页

当前为第三页:上一页 1 2 3 4 5 6 ... 30 下一页
.

当前为第6页:上一页 1 ... 3 4 5 6 7 8 9 ... 30 下一页
.

当前为第29页:上一页 1 ... 26 27 28 29 30 下一页

当前为第30页:上一页 1 ... 27 28 29 30

抽象

分析上面的例子,发现决定输出的因素有两个:当前页码和总页数。

于是,我们设定一个函数用来表示当前页码的显示内容:

/**
 * @param {Number} page 当前页
 * @param {Number} totalPage 总页数 
 */
function pagination(page, totalPage) {
  var str = '';
  // todo...

  return str;
}

// 运行函数,打印出值

var ret = pagination(4, 30)

console.log(ret)

>上一页 1 2 3 4 5 6 7 ... 30 下一页

实现

输入和输出都有了,接着正式开始撸:

function pagination(page, totalPage) {
  var str = page;
  // 这里实现当前页面显示前后三项功能
  for(var i=1; i< totalPage; i++) {
    if(page-i>1) {
      str = page-i +' '+ str;
    }
    if(page + i < totalPage) {
      str = str + ' ' + (page+i)
    }
  }

  // 以page为中心,向左右扩展

  // 向左,先判断当前page向左的第四个数是否大于 1
  if(page-4 > 1) {
    str = '... ' + page;
  }
  // 继续向左判断
  if(page >1) {
    str = "上一页" + '... ' +1 +' ' +str;
  }
  // 向右,判断当前page向右的第四个数字是否小于 totalPage
  if(page + 4 < totalPage) {
    str = '... '+ str;
  }
  if(page < totalPage) {
    str = str +' ' + totalPage +' '+ '下一页';
  }
  return str;
}

现在,我们可以执行下面的函数,取得我们想要的结果:

var total = 30;
  for(var i = 1; i< total; i++) {
   var ret = showPage(i, total);
   console.log(ret)
  }

至此,我们已经实现了分页的逻辑。

应用

接下来的应用就非常简单了,不外乎是给str 加一些标签和class,于是我们就得到了一个分页组件:

HTML:

<ul id="pagination-list" class="clearfix2">

</ul>

javascript:

function pagination(page, totalPage) {
    var str = '<li class="page-active">'+page+'</li>';
    for(var i=1; i<=3; i++) {
      if(page - i > 1) {
        str = '<li class="page-item">'+(page-i)+'</li>' +' '+ str;
      }
      if(page + i < totalPage) {
        str = str +" "+'<li class="page-item">'+(page+ i)+'</li>'
      }
    }
    if(page-4 >1) {
      str = '<li class="page-item">... </li>' +str;
    }
    if (page >1) {
      str= '<li class="page-up">上一页</li>'+ ' '+'<li class="page-item">1</li>' +' '+ str;
    }

    if(page+4< totalPage) {
      str = str+ '<li class="page-item"> ...</li>';
    }
    if(page < totalPage) {
      str = str + " " +'<li class="page-item">'+totalPage+'</li>' +" " +'<li class="page-down">下一页</li>'
    }
    return str;
  }
  var totalPage = 30;

  var str = pagination(1, totalPage);
  var wrap = $("#pagination-list");
  // 这里引用了 jQuery
  wrap.html(str)
    .on('click', '.page-item', function () {
      var cur = parseInt($(this).text());
      wrap.html(pagination(cur, totalPage));
    });

看看效果吧:

从零开始做一个pagination分页组件

目前来说,进展顺利,但是!还有很多需要优化的地方:样式固定,不能自由更改;初始化和交互混杂在一起,没有对代码进行封装...

又经过一番折腾,这个分页组件终于完成,下载demo:

https://github.com/CaptainLiao/zujian/tree/master/pagination

现在,我们可以这样调用它:

<script>
  // #pagination-list 是组件的父容器,50 是总页数。
  $(function () {
    $("#pagination-list").pagination(50);
  })
</script>

是不是很酸爽呢?

如果继续扩展,我们还可以给组件更多的样式选择......

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中的事件处理
Jan 16 Javascript
JS获取页面窗口大小的代码解读
Dec 01 Javascript
JS根据变量保存方法名并执行方法示例
Apr 04 Javascript
javascript数组操作总结和属性、方法介绍
Apr 05 Javascript
在页面中输出当前客户端时间javascript实例代码
Mar 02 Javascript
vue 中swiper的使用教程
May 22 Javascript
Vue文件配置全局变量的实例
Sep 06 Javascript
Node.js EventEmmitter事件监听器用法实例分析
Jan 07 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
Apr 17 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
Jun 29 Javascript
JavaScript实现队列结构过程
Dec 06 Javascript
vue自定义右键菜单之全局实现
Apr 09 Vue.js
Vuex模块化实现待办事项的状态管理
Mar 15 #Javascript
javascript图片预览和上传(兼容IE)
Mar 15 #Javascript
轻松理解JavaScript之AJAX
Mar 15 #Javascript
jQuery插件ContextMenu自定义图标
Mar 15 #Javascript
JavaScript对象引用与赋值实例详解
Mar 15 #Javascript
jQuery图片瀑布流的简单实现代码
Mar 15 #Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
Mar 15 #Javascript
You might like
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
kohana框架上传文件验证规则写法示例
2014/07/14 PHP
Ajax一统天下之Dojo整合篇
2007/03/24 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
vue实现选中效果
2020/10/07 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
python计算牛顿迭代多项式实例分析
2015/05/07 Python
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
Python编程中time模块的一些关键用法解析
2016/01/19 Python
Python实现的爬虫功能代码
2017/06/24 Python
python验证码识别实例代码
2018/02/03 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
工作的心得体会
2013/12/31 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
社区党务工作总结2015
2015/05/19 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android
MySQL深分页问题解决思路
2022/12/24 MySQL