原生 JS实现一个简单分页插件
最近做的一个 PC端的需求,这个需求中有一个小点,页面底部有一块列表区域,这个列表的数据量比较大,需要进行分页控制,切换页码的时候,发送一个 ajax请求,在页面无刷新的情况下,实现列表数据的刷新,所以就涉及到了前端分页功能,到网上看了一圈,发现那些开源的相关插件要么有各种依赖,要么太复杂用不上,要么上手有点困难,所以就想着应该也不太难,自己写个得了。
关于这种分页功能,平时很常见,不过需要自己动手做的需求却很少,所以一直停留在知道应该就是那么回事,但实际上自己从来没怎么探究过的层面上,知道应该会涉及到一些逻辑判断,不会实现起来应该没什么难度,然而,真的等到自己着手实现的时候,才知道什么叫想得美。
简单介绍
先上效果图:

有点类似于 Github搜索结果页的底部分页,可能部分逻辑有点出入,但总体应该差不多
代码使用 ES6语法,这个插件其实是一个 class,babel打包后可兼容到 IE9,原生js无任何依赖。
整个插件类代码 SimplePagination加上空行注释什么的共约 200行左右,不过其中有部分代码是辅助代码,例如初始化、选择器、增删类等方法,再除去空行注释,最后剩下的核心代码也就不到 100行的样子。
主要的判断逻辑都在 gotoPage这个方法中,因为需要考虑到各种情况,所以里面写了很多的 if.. else...判断,没写下这些代码之前,我觉得这个东西充其量也就几个判断差不多了,但是没想到会有这么多,每次的页码切换都对应着不同的判断分支,比较繁琐。
核心代码简要分析
核心方法是 gotoPage,乍一看,此方法中到处都是 if...else..判断,似乎无从下手,但是不论页码如何变,也不管是如何切换到某个页码的,只需要记住一点,那就是切换到某个页码时,这个页码对应的整个分页组件的状态是确定的,这一点很重要,只要把握住了这点,那一连串的 if...else...判断的意义其实也就清晰了。
此方法最外层的一个 if...else...判断是针对页码是否需要显示省略号占位符的,如果页码总数小于页面上课同时存在的页码数,那么就不需要省略符号占位了,就是一种比较简单的分页,例如下面这种:

对于这种情况,只需要在切换页码的时候,变换 active的页码即可。
至于另外那种需要省略号占位的情况,才是复杂的地方,而这个分支里,最外层有 3个判断,这 3个判断包括了所有页码切换的情况。
第一个判断是针对分页组件左边不需要出现省略号占位符的情况,例如下面这种:

第二个判断是针对分页组件右边不需要出现省略号占位符的情况,例如下面这种:

第三个判断是针对分页组件两边都需要出现省略号占位符的情况,例如下面这种:

整个分页组件的所有状态,肯定都被包括在这三种状态中,所以接下来的逻辑判断只需要针对这三个状态就行了。
用法
首先 new这个类,然后调用 init方法,传入相应的参数即可,例如:
const slp = new SimplePagination(12)
slp.init({
container: '.box',
maxShowBtnCount: 3,
onPageChange: state => {console.log('pagination change:', state.pageNumber)}
})
其中,在 new实例化 SimplePagination类的时候,需要传入 1个参数,即总页数(totalPageCount),分页插件需要根据此值来进行页码元素的绘制。
调用 init方法时,为了方便传参,此方法接收一个对象,对象中存在以下属性:
| 参数名 | 类型 | default |
说明 | 是否必填 |
|---|---|---|---|---|
container |
string |
body |
一个DOM元素的选择器,id 或者 class均可,表示分页的容器 |
否 |
maxShowBtnCount |
number |
5 |
不包括开头和结尾的两个固定按钮外,中间最多展示几个数字页码按钮 | 否 |
pCName |
string |
page-li |
所有的分页页码元素的统一类名,包括上一页、下一页 | 否 |
activeCName |
string |
page-active |
当选中页码时添加的类名class |
否 |
dataNumberAttr |
string |
页码元素上的一个属性,其值为页码元素所表示的页码 | data-number |
否 |
prevCName |
string |
page-prev |
上一页 按钮的类名class |
否 |
nextCName |
string |
page-next |
下一页 按钮的类名class |
否 |
disbalePrevCName |
string |
no-prev |
禁用 上一页 按钮的可用性时给此按钮添加的类名class |
否 |
disbaleNextCName |
string |
no-next |
禁用 下一页 按钮的可用性时给此按钮添加的类名class |
否 |
pageNumberCName |
string |
page-number |
不包括 上一页 下一页、省略号占位符按钮之外的所有页码元素统一类名 | 否 |
swEvent |
string |
click |
触发切换页面的事件 | 否 |
onPageChange |
string |
- | 页码切换时的回调函数 | 否 |
除了根据页面上的页码和上一页、下一页按钮进行页码切换外,插件还有一个 gotoPage方法可用,此方法接收一个类型为 number的参数,调用此方法,就会跳到此参数指定的页码上,例如,跳转到页码 9上:
slp.gotoPage(9)
如果传入的参数不是合法的页码,则不会进行任何操作。
本文的可运行示例代码已经放到 Github上了,有兴趣的可以看下~
SimplePagination这个类主要在于页码切换的逻辑判断,外加简单地组装了DOM结构,我在示例代码中随便写了个样式,如果你不喜欢这个样式完全可以自己重写。
原生 JS实现一个简单分页插件的更多相关文章
- 原生js实现一个简单的轮播图
想锻炼一下自己的原生js能力可以从写一个轮播图开始,轮播图的运用想必大家都知道吧,好了废话不多说,开始记笔记了,一些需要注意的点,我都在代码中标注了 首先是构造html: <div id=&qu ...
- 原生js实现一个简单的倒计时功能
大家好,我是云中君!欢迎大家来观看我的博客 之前那,在群里看到很多人问,关于电商网站中的倒计时功能怎么实现,很多人说在网上找了很多插件,但是不是很会用,所以今天就在这里分享一下我封装的一个小的倒计时功 ...
- 原生 JS 实现一个瀑布流插件
更好的阅读体验,点击 原文地址 瀑布流布局中的图片有一个核心特点 -- 等宽不定等高,瀑布流布局在国内网网站都有一定规模的使用,比如pinterest.花瓣网等等.那么接下来就基于这个特点开始瀑布流探 ...
- 如何用原生JS实现一个简单的promise
我又又又回来了,最近真是累的跟狗一样,急需一个大保健回复一下子精力 我现在是一边喝着红牛一边写着博客,好了好了,不扯了,回归整体好吧 先简单来说一下啥是promise吧 它是什么?Promise是一个 ...
- 原生JS实现一个简单的前端路由(原理)
说一下前端路由实现的简要原理,以 hash 形式(也可以使用 History API 来处理)为例, 当 url 的 hash 发生变化时,触发 hashchange 注册的回调,回调中去进行不同的操 ...
- 封装一个简单的原生js焦点轮播图插件
轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...
- 用原生js写一个"多动症"的简历
用原生js写一个"多动症"的简历 预览地址源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js来实现. 会动的简历实现 ...
- 用JS做一个简单的电商产品放大镜功能
使用js制作一个简单的产品放大图 购物网站的产品页经常会放有一个产品展示图区.该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图.实现该功能的方法也非常简单. ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
随机推荐
- octotree — 树形展示 Github 项目代码
前言.... octotree 是一款chrome插件,用于将 Github 项目代码以树形格式展示,而且在展示的列表中,我们可以下载指定的文件,而不需要下载整个项目 源码地址: https://gi ...
- Thinkphp 使用小结
分页中带查询参数 ...->paginate(15,false,['query'=>request()->param()]); 队列后台自动开启运行 nohup php think ...
- #学习笔记:CentOS7学习之十三(2):磁盘介绍与管理
1.磁盘分区工具与挂载 1.1 硬盘分区符认识: MBR概述:全称为Master Boot Record,即硬盘的主引导记录. 硬盘的0柱面.0磁头.1扇区称为主引导扇区(也叫主引导记录MBR).它由 ...
- 2019牛客暑期多校训练营(第七场)-B Irreducible Polynomial(多项式因式分解)
题目链接:https://ac.nowcoder.com/acm/contest/887/B 题意:给定整系数多项数,判断实数域上是否可约. 思路: AC代码: #include<cstdio& ...
- SpringBoot起飞系列-自定义starter(十)
一.前言 到现在,我们可以看出来,如果我们想用一些功能,基本上都是通过添加spring-boot-starter的方式来使用的,因为各种各样的功能都被封装成了starter,然后把相关服务注入到容器中 ...
- Scala(一)安装
一.环境信息 操作系统:cat /etc/redhat-release JDK: java -version 二.下载Scala安装包 网址:https://www.scala-lang.org/d ...
- PAT A1009 Product of Polynomials(25)
课本AC代码 #include <cstdio> struct Poly { int exp;//指数 double cof; } poly[1001];//第一个多项式 double a ...
- C#常见面试题(一)——try-catch-finally-return
面试常会被问及try-catch-finally,现在做一下总结: 第一.不管有没有出现异常,finally块中代码都会执行. 第二.finally 代码块中不能有return. 第三.如果try 或 ...
- Python安装及环境变量
针对windows操作系统 1.下载安装包,python官网下载(https://www.python.org/) python3.7.4:下载https://www.python.org/downl ...
- Linux更改ext4根目录文件系统大小
首先通过lsblk 查看一下文件系统情况 然后通过fdisk /dev/sda类似命令,打开对应的磁盘管理,然后: 删除所有磁盘分区 重新建立一个更大的分区. 保存退出 再次通过lsblk查看分区大小 ...