J2EE项目特别是后台管理,或者一部分前台展示数据比较多,通常需要分页把展示折叠在数据区内.

一般有几种方式来实现分页, 一是官方分页插件,二是自己写,三是网上找(类似于第一种)

这里就介绍第二种, 自写的分页器.

问题就是如果让数据折叠在数据区内, 一种方式是一次取回所有接口数据, 将分页逻辑写在前端, 这种方式相对简单,

且不会刷新页面, 只是考虑到一次数据太多, 会占用很多时间来传数据,生成DOM树,而且数据刷新比较滞后,一般不用.

第二种方式即是当下流行的方式, 将数据分页写在服务端,一次请求一页数据, 每次传页码页数,这样服务器每次返回一

页的数据供前端展示, 小巧灵活. 不便的是每次需要传页码和页数,频繁翻页会增加请求量.

接下来我就来分析一下分页的逻辑.

1. 先看效果

2. 主要功能: 点击页码处,提交请求页. 点击<和>上翻片和下翻片,附加功能是点击某片中最后一页,下翻片, 点击某片中第一页,上翻片.

3. 主要的障碍: 如何记录当前页, 如何分片, 如何共用分页器

主要的逻辑:服务器和客户端都需要增加逻辑, 服务器为数据列表型接口增加两个参数,page和pageSize, 指示当前页和页大小.

利用Hibernate中的listByPage来分页. 返回特定页的数据,注意数据是从第1页开始的.再将当前页和页大小传回到客户端.

客户端主要是提供一个表单来上传page和pageSize,通过点击页码来提交表单.获取Total后根据当前面和页大小生成当前片上的页码.

需要标记出当前分页器<和>的DOM位置,生成页码.

JS主要逻辑:

var allPageArray = new Array();
var pageArray = new Array();
var currentSlice = 1;// 当前片码
var currentPage = $('#pageHolder')[0].value;// 当前页码
var count = $('#countHolder')[0].value; // 总记录数
var initPageNum = 10; // 每片页码数量
var totalPage = Math.ceil(count / initPageNum);// 总页数
var pageUl = $('.pagination>ul')[0]; // 页码父结点
var pageNextPlace = $('li.next')[0]; // 下一片码对象
var pagePrevPlace = $('li.previous')[0]; // 上一片码对象
var lastPageTips = $('.lastPageTips')[0]; //最后一页提示DOM
clearPage(); //清空页码
initAllPageArray();//初始化 function initAllPageArray() {
for (var i = 0; i < totalPage; i++) { // 填充totalPage内容
allPageArray[i] = i;
}
if (totalPage >= initPageNum) { // 如果大于10页,装载当前面所在页片上的页码
if (currentPage == totalPage) { // 如果已经到达最后一页
pageArray = allPageArray.slice(currentPage - initPageNum,
currentPage);
tipLastPage();
} else {
pageArray = allPageArray.slice(currentPage - currentPage
% initPageNum, currentPage - currentPage % initPageNum
+ initPageNum > totalPage ? totalPage : currentPage
- currentPage % initPageNum + initPageNum);
}
} else {
pageArray = allPageArray;// 如果少于10页,全部展示
if (currentPage == totalPage) {
if (totalPage != 1) {
tipLastPage();
}
}
}
loadPage(pageArray); // 装载页码
$('.pagination-style>ul>li>a').each(function() { // 激活当前页码样式
if (this.innerHTML == currentPage) {
this.parentNode.className = "active";
}
});
} // 取上/下翻页码数组
function getPageArray(pageArray, direct) {
if (allPageArray.length != 0 && pageArray.length != allPageArray.length) { // 如果长度不相等则说明长度够几片
if (direct == 0) {// 前翻
if (pageArray[pageArray.length - 1] >= initPageNum) { // 从11页以后往前翻,前进10页
if (pageArray[0] >= initPageNum) {// 首页大于10页,则取前10页
pageArray = allPageArray.slice(pageArray[0] - initPageNum,
pageArray[0]);
} else {// 首页小于10,取上一页可能不满10页,则显示0-9页
pageArray = allPageArray.slice(0, initPageNum);
}
} else {// 从1-10页往前翻.装1-10
// 页码不需要加载
}
} else if (direct == 1) {// 后翻
if (pageArray.length < 10
|| (pageArray.length == 10 && pageArray[pageArray.length - 1] == allPageArray.length - 1)) {// 最后一片没装满或者最后一页装的是最后一片
// 不需要处理
pageArray = pageArray;
tipLastPage();
} else {
if (allPageArray.length >= (pageArray[pageArray.length - 1] + 10)) {// 最后还有一片可以装满
pageArray = allPageArray.slice(
pageArray[pageArray.length - 1] + 1,
pageArray[pageArray.length - 1] + 1 + initPageNum);
} else {// 最后一片,装不满
pageArray = allPageArray.slice(
pageArray[pageArray.length - 1] + 1,
allPageArray.length);
}
} }
} else {// 如果长度不够10,说明一片都没存满
pageArray = allPageArray;
}
return pageArray;
}
// 加载页码DOM
function loadPage(array) {// 加载一片页码
var pageUl = $('.pagination>ul')[0];
var pageNextPlace = $('li.next')[0];
var num = initPageNum;
for (var i = 0; i < array.length; i++) {
var pageNode = pageNextPlace.cloneNode(true);//克隆的是>下翻的DOM
pageNode.className = "";//清空className, classList不适配所有的浏览器
var aLink = pageNode.querySelector("a");
aLink.innerHTML = array[i] + 1;//写上页码
aLink.className = "";
pageUl.insertBefore(pageNode, pageNextPlace);
}
initPageNodeClick();
}
// 提交search form表单
$('input')[2].onblur = function() {
$("[name='page']")[0].value = "1";
$('#searchForm')[0].submit();
}
//
$('input')[2].onfocus = function() {
$("[name='page']")[0].value = "1";
} // 初始化页片上页码的点击响应功能
function initPageNodeClick() {
$('.pagination-style>ul>li>a')
.each(
function() {
this.onclick = function() {
if (this.className == "fui-arrow-left") {
if (totalPage <= 10) {
if (undefined == $('.pagination-style>ul>li>a')[1].click) { dispatch(
$('.pagination-style>ul>li>a')[1],
"click"); // safari
} else {
$('.pagination-style>ul>li>a')[1]
.click();
}
;
} else {
pagePrevClick();
}
} else if (this.className == "fui-arrow-right") {
if (totalPage <= 10) {
if (undefined == pageUl
.querySelectorAll('li')[totalPage]
.querySelector('a').click) { dispatch(
pageUl.querySelectorAll('li')[totalPage]
.querySelector('a'),
"click"); // safari
} else {
pageUl.querySelectorAll('li')[totalPage]
.querySelector('a').click();
}
} else {
pageNextClick();
}
} else {
$("[name='page']")[0].value = this.innerHTML;
$('#searchForm')[0].submit();
} };
})
}
// 清空页码DOM
function clearPage() {
var liArray = $('.pagination-style>ul>li');
for (var i = 0; i < liArray.length; i++) {
var li = liArray[i];
if (li.className != 'previous' && li.className != 'next') {
pageUl.removeChild(li);
}
}
} // 上翻页片功能
function pagePrevClick() {
clearPage();
pageArray = getPageArray(pageArray, 0);
loadPage(pageArray);
}
// 下翻页片功能
function pageNextClick() {
var temp = getPageArray(pageArray, 1);
if (pageArray != temp) {
pageArray = temp;
clearPage();
loadPage(pageArray);
}
}
function tipLastPage() {
$(lastPageTips).css("visibility", "visible");
clearTips();
} function clearTips() {
setTimeout(function() {
$(lastPageTips).css("visibility", "hidden");
}, 1500);
}
//为了适配Safari,点击a标签不会触发onclick事件.
function dispatch(el, type) {
try {
var evt = document.createEvent('Event');
evt.initEvent(type, true, true);
el.dispatchEvent(evt);
} catch (e) {
alert(e);
}
}

  

J2EE简单的分页器的更多相关文章

  1. Bootstrap页面布局18 - BS导航路径以及分页器

    导航路径:又叫“面包屑”,功能是让用户知道所处的位置. <!--面包屑--> <ul class='breadcrumb'> <li><a href='#'& ...

  2. drf框架之分页器的用法

    1. 分页器分为:简单分页器与偏移分页器和加密分页器 2.实现一个简单的分页器的用法: # 简单分页 # 第一步,导入分页类 # from rest_framework.pagination impo ...

  3. Django组件之分页器

    分页器 简单的分页器实现 views.py from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger from ap ...

  4. vue实现分页器(仿element)

    1.起因 今日看完element中分页器的源码实现,比较简单,遂自己按着理解实现了一个简单的分页器,记录下来,以便日后温习. 2.实现难点 分页器的实现难点主要是什么时候显示分页器的省略, 我的思路是 ...

  5. angular实现简单的pagination分页组件

    不想使用第三方库,只想使用一个分页器,那么就简单的实现一个,效果如下: 1.使用方式: <custom-pagination *ngIf="enterpriseList.length& ...

  6. ASP.NET MVC 数据分页思想及解决方案代码

    作为一个程序猿,数据分页是每个人都会遇到的问题.解决方案更是琳琅满目,花样百出.但基本的思想都是差不多的. 下面给大家分享一个简单的分页器,让初学者了解一下最简单的分页思想,以及在ASP.NET MV ...

  7. play framework2.5.

    play framework2 的学习笔记 https://github.com/playframework/playframework https://github.com/playframewor ...

  8. java分页之假分页

    假分页,顾名思义,不是真正的在数据库里进行过滤,而是从数据库查询之后,取得全部结果,在展现的时候做些手脚. import java.util.ArrayList; import java.util.L ...

  9. Django杂篇(1)

    目录 Django杂篇(1) bulk_create Pagination 创建多对多表关系的常用方法 form校验组件的应用 渲染页面 展示错误信息 校验数据 常用字段 Django杂篇(1) 这里 ...

随机推荐

  1. GoAccess 分析 Nginx 日志

    0x00 事件 帮助朋友搭建了博客,运行过了一段时间,准备发个网站分析报告给他. 有效的数据只有 Nginx 的访问日志,于是使用决定 GoAccess 工具对这个日志进行分析, 0x01 安装 吾使 ...

  2. 第一次Git使用以及码云(Gitee)

    下载安装Git,官网下载地址https://git-scm.com/downloads,我用的是Win10版,下载好后一路默认安装,安装时会给你自动添加环境变量,完成后打开cmd,输入git --ve ...

  3. 100天搞定机器学习|day43 几张GIF理解K-均值聚类原理

    前文推荐 如何正确使用「K均值聚类」? KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把 ...

  4. js中toFixed精度问题的解决办法

    toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.例如将数据Num保留2位小数,则表示为:toFixed(Num):但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规 ...

  5. 剑指Offer(十八):二叉树的镜像

    剑指Offer(十八):二叉树的镜像 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu ...

  6. **p,*p和&p使用有感

    *p两种使用情况: 1.定义指针变量,如char *p:这里p是一个变量,单单在这一点上与int a 无差别:但p这个变量特殊在其中只能存地址. 引申:对于char **p,p中存一个地址add1,a ...

  7. 基于HttpClient4.5.1实现Http访问工具类

    本工具类基于httpclient4.5.1实现 <dependency> <groupId>org.apache.httpcomponents</groupId> ...

  8. Spring入门(十一):Spring AOP使用进阶

    在上篇博客中,我们了解了什么是AOP以及在Spring中如何使用AOP,本篇博客继续深入讲解下AOP的高级用法. 1. 声明带参数的切点 假设我们有一个接口CompactDisc和它的实现类Blank ...

  9. ubuntu安装后的基本配置及常用软件的安装

    文章作者:foochane  原文链接:https://foochane.cn/article/2019061501.html 内容简介 当前Ubuntu版本:ubuntu 18.04,具体操作如下: ...

  10. python 09 函数

    目录 函数初识 1. 函数定义: 2. 函数调用: 3. 函数的返回值: 4. () 4.1 位置传参: 4.2 关键字传参: 4.3 混合传参: 函数初识 1. 函数定义: def 函数名(): 函 ...