原生 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写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
随机推荐
- prometheus 监控elasticsearch
1.安装: 如果有elk单独用户,切换到该用户下, wget下载,进入到es安装目录,执行 ./elasticsearch-plugin install file://$(pwd)/../../ela ...
- python列表一
1.列表数据类型 列表是一个值,它包含多个值构成,也可包含其他列表,其内的表项用逗号分隔 列表值:作为一个值可以保存在变量中,或传递给函数,像所有其他值一样. #不是指括号内的值 表项:列表中的值, ...
- Go语言Mac、Linux、Windows 下交叉编译
在很多时候,由于开发的方便,会有这样的场景出现,使用Mac开发或使用Windows开发,需要编译成Linux系统的执行文件,那么如何做到?Go语言提供了非常方便的命令行操作,即可实现. 1.Mac下编 ...
- T100-----汇出EXCEL表格
例子:cxmp541 #excel匯出功能 ON ACTION exporttoexcel LET g_action_choice="exporttoexcel" IF cl_au ...
- FTP-实例(Md5验证)
import socket, os, hashlib server = socket.socket() server.bind(("localhost", 9999)) serve ...
- centos中mariadb的相关操作
Tip 1 在使用mariadb中启动服务报错 : Failed to start mariadb.service: Unit not found. 解决办法: yum install -y mari ...
- Atcoder-SoundHound Inc.Contest 2018 -Masters Tournament-比赛报告
A C++ Example #include <iostream> #include <cstdio> #include <cstdlib> #include &l ...
- Ubuntu12.04+Caffe (+OpenCV+CPU-only)
经过一天的努力发现12.04 的pcre的库太低了, 要解决这个bug只能升级系统到16.04 麻蛋!!! 1. 下载大神MTCNN 源码,内含caffe https://github.co ...
- 防止表单提交时刷新页面-阻止form表单的默认提交行为
最近在写 ajax 提交的时候遇到一个问题,在执行 ajax 提交之后,浏览器页面自动刷新了,主要是没有 由于form 表单的默认提交行为.一下是几种阻止 form 表单默认提交行为的方式. 1.使用 ...
- 嵌套For循环性能优化
请对以下的代码进行优化 for (int i = 0; i < 1000; i++) for (int j = 0; j < 100; j++) for (int k = 0; k < ...