原生 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写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
随机推荐
- mysql数据库设计字符类型及长度
1.数字类型 小数的我就不聊了,因为有小数点的一般都是用字符串保存.关于整数,有几种可以选TINYINT.SMALLINT.MEDIUMINT.INT和BIGINT,分别占1.2.4.8字节.如果无符 ...
- MFC控件使用大全
https://blog.csdn.net/daoming1112/article/details/54698113
- 美团2017年CodeM大赛-初赛A轮 C合并回文子串
区间dp一直写的是递归版本的, 竟然超时了, 学了一下非递归的写法. #include <iostream> #include <sstream> #include <a ...
- 垃圾分类API
###自从上月开始实行垃圾分类,整个上海人都已经“疯掉”了.那么,我们应该怎么识别什么是“垃圾”呢? 这里,我提供了并整理了几个api,其中包括图像识别,垃圾分类查找,根据关键字或者图片的内容来进行查 ...
- windowsformshost mouse event not transmit to it's parent control
in the case you can do it to fix: MouseEventArgs e = new MouseEventArgs(Mouse.PrimaryDevice, 0); e.R ...
- Linux下安装Jenkins并且发布.net core
一,基础环境 1,操作系统:CentOS 7.3 2,Docker version 18.09.6 docker安装参考:https://www.cnblogs.com/liuxiaoji/p/110 ...
- C#.net开发 List与DataTable相互转换
1.DataTable转List集合 /// <summary> /// DataTable转化为List集合 /// </summary> /// <typeparam ...
- SpringBoot整合MyBatis的分页插件PageHelper
1.导入依赖(maven) <dependency> <groupId>com.github.pagehelper</groupId> <artifactId ...
- Java基础第三天--内部类、常用API
形参和返回值 抽象类名作为形参和返回值 方法的形参是抽象类名,其实需要的是该抽象类的子类对象 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象 接口名作为形参和返回值 方法的形象是接口名,其实需 ...
- dom和bom之间的区别
BOM的核心是windows,表示的是一个浏览器的实例,在网页中自定义的任何一个对象.变量和函数,都以windows作为其全局对象 DOM是针对HTML和XML文档的一个API bom:(Browse ...