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. java之异常详解

    一.什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域正常运行的情况,称之为异常. 二.异常体系 Java把异常当作对象来处理,并定义一个基类java. ...

  2. php cmd命令行 导入 与备份

  3. c# 读取 txt 文件中数据(int)

    今天在学图的算法做测试是,需要读取文本文件中的点坐标,本来很简单的事情,折腾了半天,记录一下找到的一种简单粗暴的解决方法,以便以后查看. 第一种方法 : StringReader string lin ...

  4. bilibili弹幕爬取与比对分析

    最近受人之托研究了下b站的数据爬取做个小工具,最后朋友说不需要了,本着开源共享的原则,将研究成果与大家分享一波,话不多说直接上干货 需求分析 给定up主uid和用户uid,爬取用户在该up主所有视频中 ...

  5. 非域环境下SQL Server搭建Mirror(镜像)的详细步骤

    1.测试验证环境 服务器角色 机器名 IP SQL Server Ver 主体服务器 WIN-TestDB4O 172.83.XXX.XXX SQL Server 2012 - 11.0.5058.0 ...

  6. BigDecimal 使用浅析

    当参数单一时: 代码public class B { //BigDecimal函数测试类 public static void main(String agrs[]){ System.out.prin ...

  7. Java集合框架之ArrayList浅析

    Java集合框架之ArrayList浅析 一.ArrayList综述: 位于java.util包下的ArrayList是java集合框架的重要成员,它就是传说中的动态数组,用MSDN中的说法,就是Ar ...

  8. JAVA 泛型中的通配符 T,E,K,V,?

    前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...

  9. 迁移桌面程序到MS Store(10)——在Windows S Mode运行

    首先简单介绍Windows 10 S Mode,Windows在该模式下,只能跑MS Store里的软件,不能通过其他方式安装.好处是安全有保障,杜绝一切国产流氓软件.就像iOS一样,APP进商店都需 ...

  10. 浏览 GitHub 太卡了?教你两招!

    老实说,GitHub 在国内的使用体验并不算太好,这其中最大的原因就是网络了. GitHub 访问起来比较卡,这个看起来貌似无解.国内的 gitee 网速倒是可以,但是无法代替 GitHub,个人感觉 ...