当前位置: 代码迷 >> Web前端 >> jquery分页时 数据与实际分离
  详细解决方案

jquery分页时 数据与实际分离

热度:405   发布时间:2012-10-14 14:55:08.0
jquery分页时 数据与现实分离

在日常的工作中分页的使用的频率相对来说比较高,最近学习了jquery封装了一个用于数据显示分页的代码

利用jquery 的选择器 将标签的集合看成一个数组 然后利用数据量的多少来 显示内容

例如:

<ul id="lis">

??<li><h3></h3><span><img src=""></span></li>

?<li><h3></h3><span><img src=""></span></li>

?<li><h3></h3><span><img src=""></span></li>

?<li><h3></h3><span><img src=""></span></li>

?<li><h3></h3><span><img src=""></span></li>

?<li><h3></h3><span><img src=""></span></li>

</ul>
? 上一页 1 2 3...7 下一页

funciton printData(n,data) {

var curLi=?$("lis li").eq(n);0...n;?
curLi.find("h3").text?(data.imageName)????????? //("第n张图片");

curLi.find("img").attr("src",data.src).attr("alt",data.imageName)?? //?? ("第n张图片");

var pa=$("#photoList li")li的集合

?}

使用:

(将标签里面的属性或者数据替换)
function initPage(sendData) {
//对象数据
var option={
//当前页面的对象
curPageElement:$("#photoList li"),
//数据 遍历
dataPagingInfo:{
dataPaging:$("#imagePage"),? //页码数
pageSize:"20", //每页显示的数据大小
current:"1"??? //当前页
},
sendData:sendData,
url:"/admin/photo/action.do",
//回调方法
backMethods:{
//输出数据
printData:function(i,data) {
pa.eq(i).text(data.content);
?????? },
//数据 的长度
?????? dataLen:function(length) {

?????? $("#imageSum").text(length);
?????? }
?????? }
? }

//初始化参数
pageList.init(option);

//刷新当前页面
pageList.coreFlow();
}

一、pageList.js(分页时的数据交互)

// 减少不必要的 请求 进一步增强用户体验对 和 缓解服务器 压力
//?? 思路:
// 1、在对象后面添加 一个method保存页码
// 2、这个页码作为 缓存对象的标识符 每次检查这个标识符 确认是否存 缓存缓存过这个对象
//option中的参数说明
/***
* 前台页面 遍历思路
* 适合于分页遍历的数据
*?? 分析:
*??? 1、数据显示 只和? html的展现形式有关系? 与? html本身的构造无关
*??? 2、事件只和 html本身的构造有关系 和?? 数据的显示无关
*?????? 此种方式 完全脱离? 服务器编程语言的限制
* 此时html完全静态化通过apach转发不依赖于后台程序:
* 对于服务器来说只需要提供结构化的数据(json)
* 而客户端则通过js直接请求json数据 再将其填充到html代码中 在效果体现方面html代码只有show 和hide的体现形式
*
* 优点: 1、有利于 服务器集群扩展
* ? 2、缓解的数据的并发量
* ? 3、静态化的页面替代了传统的jsp 减少了jsp 到 class的这一过程 加快了服务器运行的速度
*
* 传统显示的分析:
*?????? 1、将数据显示和html代码混为一趟 造成html随数据的改变而重构
*?????? 2、重构也带来了事件的重复绑定
*
*
*
此js依赖于 jquery.js jquery.util1.1.js 用于数组遍历? 发送请求?? jquery.pageFoot.js 用于分页 (借鉴了别人的)
***/


var pageList={
//对象数据
option:{
//当前页面的数据
curDatas:"",
//当前页面的对象
curPageElement:"",
//数据 遍历
dataPagingInfo:{
dataPaging:"",
pageSize:"4",
current:"1",
count:"",
pgCount:"",
//是否启用缓存
isCache:"true"
},
sendData:"",
url:"",
//回调方法
backMethods:{
//输出数据
printData:"",
//没有数据是触发
dataLen:""
},
reqArg:{
//同步与否
async:false
}
},
//缓存对象
caches:{},
//在缓存中添加数据
addCachData:function(data) {
//添加一个属性缓存这个对象
data.curIndex=this.getCurPage();
this.caches.push(data);
},
//检查 数据是否存在于 之中 如果用则返回这个对象 反之 则返回空
checkCaches:function() {
var page=this.getCurPage();
//检查 数据是否缓存
var fObj=objectUtil.findByProperty(page,"curIndex",this.caches);
if(fObj==null) {
return null;
}
//重缓存中获取数据
this.option.curValues=fObj;
return fObj;
},
//将数据一次性添加到缓存
addCachAllData:function(caches) {
this.caches=caches;
},
//是否运行虚拟页面效果
isVirtual:function() {
return this.option.dataPagingInfo.virtual;
},
//设置默认的数据作为缓存效果
setDefCache:function(delData) {
this.option.curValues.datas=delData;
//默认情况计算缓存分页
if(!this.option.dataPagingInfo.isPage)
this.virtualCount();
},
setisVirtual:function(virtual) {
this.option.dataPagingInfo.virtual=virtual;
},
// 不需要请求数据 的分页效果
virtualCount:function() {
var pageSize = this.option.dataPagingInfo.pageSize;
var caches=new Array();
var datas=this.option.curValues.datas;
//根据数据的大小计算出分页大小
//1、计算数据的量
var count=datas.length;
this.option.curValues.total=count;
//2、计算分页数量
var pageCount=parseInt((count%pageSize==0)?count/pageSize:(count/pageSize)+1);
var n=0;
for(var i=0;i<pageCount;i++) {
var daryy=new Array();
var data={};
for(var j=0;j<pageSize;j++) {
if(datas[n]) {
daryy.push(datas[n++]);
}
}
data.datas=daryy;
data.curIndex=i+1;
data.total=count;
this.caches.push(data);
}
this.option.curValues=this.caches[0];
//开启缓存
this.setCaches=true;
this.option.dataPagingInfo.virtual=false;
},
//设置url
setUrl:function(ur) {
this.clearCache();
this.Option.url=ur;
},
//设置当前页码数 (当前第几页)
setCurrentPage:function(page) {
this.option.dataPagingInfo.current=page;
},
//设置当前页面大小
setPageSize:function(size) {
this.option.dataPagingInfo.pageSize=size;
},
//缓存开关
isCaches:function() {
return this.option.dataPagingInfo.isCache;
},
setCaches:function(isCache) {
this.option.dataPagingInfo.isCache=isCache;
},
setCurPageCaches:function(curValue) {
this.caches[this.getCurPage()-1]=curValue;
},
//设置当前遍历对象
setCurPageElement:function(obj) {
this.clearCache();
this.option.curPageElement=obj;
},
init:function(option) {
$.extend(this.option,option);
$.extend(this.option,this.option,this.backMethods);
//默认开启缓存
this.option.dataPagingInfo.isCache=true;
this.caches=new Array();
},
setSendData:function(sendData) {
this.clearCache();
this.option.sendData=sendData;
},
//获取当前的数据
getCurList:function() {
return this.option.curDatas;
},
//获取当前 显示的数组
getDatasList:function() {
return this.option.curValues.datas;
}
,
//复位分页
resetPage:function() {
this.option.dataPagingInfo.current=1;
},
//获取总数量
getCount:function() {
return this.option.dataPagingInfo.count;
},
//获取当前的总数量
getCurCount:function() {
return this.option.curDatas.length;
},
//请求数据
reqService :function() {
//定义默认分页
this.option.dataPagingInfo.current=this.getCurPage()||1;
//定义默认分页大小
this.option.dataPagingInfo.pageSize=this.option.dataPagingInfo.pageSize||2;

//获取当前页码
this.option.sendData.page=this.getCurPage();
//设定每一页显示的数据
this.option.sendData.pageSize=this.option.dataPagingInfo.pageSize;
var curUrl=this.option.url;
var reqnew = new ReqNewDatas(); //jquery.util1.1.js中
reqnew.isAsync(this.option.reqArg.async);
if(reqnew.getDatas(curUrl,this.option.sendData)){
this.option.curValues = reqnew.curDatas;
return true;
}
return false;

},
//检查是否清空缓存
checkClear:function() {
if(!this.option.dataPagingInfo.oldPage||this.option.dataPagingInfo.oldPage==this.getCurPage()){
this.caches=new Array();
return true;
}
return false;
},
//清空缓存
clearCache:function() {
this.caches=new Array();
},
//回调显示
callShow :function() {
this.option.dataPagingInfo.count=this.option.curValues.total;
this.option.curDatas=this.option.curValues.datas;

//数据的总长度
this.option.backMethods.dataLen(this.option.curValues.total,this);

//根据数据量显示或者隐藏标签
this.controlStyle(this.option.curValues.datas.length);

//记录上一次分页
this.option.dataPagingInfo.oldPage=this.getCurPage();
//显示数据量
objectUtil.iterElement(jQuery.proxy(this.option.backMethods.printData, this),this.option.curValues.datas);

//默认情况下计算分页
if(!this.option.dataPagingInfo.isPage) {
//计算分页
this.scrPage();
this.option.dataPagingInfo.dataPaging.show();
} else {
this.option.dataPagingInfo.dataPaging.hide();
}
if(typeof this.option.backMethods.finish=="function")
//所有遍历完成之后
this.option.backMethods.finish();
},
//核心控制 1、先检查缓存 2、根据是否缓存数据 而请求
coreFlow :function() {
//检查是否清空缓存
this.checkClear();
if(this.checkCaches()==null) {
//请求数据
if(this.reqService()) {
//运行虚拟数据分页效果
if(this.isVirtual()) {
this.virtualCount();
}else
//检查是否将数据 缓存起来
if(this.option.dataPagingInfo.isCache) {
this.addCachData(this.option.curValues);
}
}
}
//回调
this.callShow();

},
controlStyle:function(curCount) {
this.hideStyle(curCount);
this.showStyle(curCount);
},
//数据显示效果的实现 隐藏没有数据的项
showStyle:function(curCount) {
if(curCount<this.option.dataPagingInfo.pageSize) {
for(var i=curCount;i<this.option.dataPagingInfo.pageSize;i++) {
this.option.curPageElement.eq(i).hide();
}
}
},
hideStyle:function(curCount) {
for(var i=0;i<curCount;i++) {
this.option.curPageElement.eq(i).show();
}
},
setFootOption:function(option) {
$.extend(this.option.dataPagingInfo,option);
},
//分页
scrPage :function() {
var _this=this;
var displaynum=this.option.dataPagingInfo.displaynum;
if(!displaynum) displaynum=3;
var displaylastNum=this.option.dataPagingInfo.displaylastNum;
if(!displaylastNum) displaylastNum=1;
var css=this.option.dataPagingInfo.css;
if(!css) css="mj_pagefoot";
this.option.dataPagingInfo.dataPaging.pagefoot({
pagesize:this.option.dataPagingInfo.pageSize,//每页显示6条
count:this.option.dataPagingInfo.count,//总记录
current:this.option.dataPagingInfo.current,?? //当前页码
css:css,
displaynum:displaynum, //中间显示页码数
displaylastNum:displaylastNum, //最后显示的页码数
??? previous:" &nbsp; ",
??? next:" &nbsp; ",
paging:function(page) {
_this.option.dataPagingInfo.current=page;
_this.coreFlow();
},
getPgCount:function(pgCount) {
_this.option.pgCount=pgCount;
}
});
},
//获取当前页面
getCurPage:function() {
return this.option.dataPagingInfo.current;
},
//总页面数量
getPgCount:function() {
return this.option.pgCount;
}
}

?

?

?

?

?

jquery.utils.js封装的一个工具包

//对象工具操作类
?var objectUtil={
??//id 字段值 property字段值对应属性 datas集合
??findByProperty :function(id,property,datas) {
???for(var i=0;i<datas.length;i++) {
????if(datas[i][property]==id) {
?????return datas[i];
????}
???}?
???return null;
??},
??
??//根据这个元素找到他所对于的下标值
??findSuffixByProperty:function(id,property,datas) {
???for(var i=0;i<datas.length;i++) {
????if(datas[i][property]==id) {
?????return i;
????}
???}?
???return null;
??},
??//遍历元素 fun遍历函数 datas数据集合
??iterElement :function(fun,datas,args) {
???if(datas) {
????for(var i=0;i<datas.length;i++) {
?????if(!args) {
??????fun(i,datas[i]);
?????} else {
??????fun(i,datas[i],args);
?????}?
????}
???}
??},
??//根据字段类型的某个值 返回相应的集合 values="1,2,4,8";
??//
??????? //? ??var ab=[{id:1,text:"我扩大是否1"},{id:2,text:"我扩大是否2"},{id:2,text:"我扩大是否3"},{id:1,text:"我扩大是否4"}];
??????? //? ??var arry=objectUtil.findByPropertys("1,2","id",ab);
??????? //? ??for(var i=0;i<arry.length;i++) {
??????? //? ???var vs="";
??????? //? ???for(var j=0;j<arry[i].values.length;j++) {
??//????vs+=" id:"+arry[i].values[j].id+"? text:"+arry[i].values[j].text+",? ";????????? ????
??????? //? ???}
??????? //? ???alert(arry[i].typeId+"??? "+vs);
??????? //? ??}
??//
??// 按照类型排序 0,1
??findByPropertys:function(values,property,datas,isSort) {
???var vs=values.split(",");
???var arry=new Array();
???for(var i=0;i<vs.length;i++) {
????var data=new Object();
????data.typeId=vs[i];
????data.values=new Array();
????arry.push(data);
???}
???var sortArry="";
???if(isSort)
????sortArry=new Array();
????
???for(var j=0;j<arry.length;j++) {
????for(var i=0;i<datas.length;i++) {
?????if(datas[i][property]==parseInt(arry[j].typeId)) {
??????if(!isSort) {
???????arry[j].values.push(datas[i]);
??????} else {
???????sortArry.push(datas[i]);
??????}
?????}
????}
???}
???if(isSort)
????return sortArry;
???return arry;???
??}
?}
?
?var ArryHandle=function(option) {
??this.init(option);
?}?
?//对数组的操作
?ArryHandle.prototype={
??curArray:"",
??//idProperty唯一性标识符字段
??option:{
???idProperty:"",
???maxLen:"",
???index:0
??},
??init:function(option) {
???$.extend(this.option,option);
???if(typeof this.curArray!="Array") {
????this.curArray=new Array();
???}
??},
??//元素过长 返回1? 成功返回 0 有重复元素放回 2; cover表示是否覆盖元素默认不覆盖
??addElement:function(obj,cover) {
???if(this.getCurLen()>this.option.maxLen-1) {
????return 1;
???}
???//检查数组是否有重复的元素
???var curObj = objectUtil.findByProperty(obj[this.option.idProperty],this.option.idProperty,this.curArray);
???if(curObj!=null&&!cover) return 2;
????this.curArray.push(obj);
???return 0;
??},
??//获得当前数组的长度
??getCurLen:function() {
???return this.curArray.length;
??},
??//获取最后一个元素的索引值
??getLastIndex:function() {
???var len=this.getCurLen();
???return len-1;
??},
??//根据这个对象删除 一个元素
??delElement:function(obj,shiffix) {
???var index=this.findIndex(obj);
???if(index!=null) {
????this.shifArray(index,shiffix);
????return index;
???}
???return null;
??},
??shifArray:function(index,shiffix) {
???for(var i=index;i<this.curArray.length;i++) {
????if(this.curArray[i+1]) {
??????this.curArray[i]=this.curArray[i+1];
??????if($.isFunction(shiffix)) {
???????shiffix(this.option.pageArray.eq(i),this.option.pageArray.eq(i+1));
??????}
????}
???}
???this.curArray.pop();
??},
??//根据当前元素寻找它在数组中的索引
??findIndex:function(obj) {
???return objectUtil.findSuffixByProperty(obj[this.option.idProperty],this.option.idProperty,this.curArray);
??},
??//查找某个元素
??findByProeprty:function(id) {
??? return objectUtil.findByProperty(id,this.option.idProperty,this.curArray);
??}
?}
?
?var reqDatas={
??//当前的数据集合
??curDatas:"",
??type:"get",
??async:false,
??//获取数据
??setType:function(type) {
???this.type=type;
??},
??getDatas:function(ul,data) {
???ul+="?t="+Math.random()*10000;
???var datas =? $.ajax({
????url:ul ,
????data:data,?
????type:this.type,
???? async: this.async
???}).responseText;
???if(datas.length>0) {
????this.curDatas= jQuery.parseJSON(datas);
????return true;
???}
???return false;
??}
?}
?
?var ReqNewDatas=function() {}?
?ReqNewDatas .prototype={
??//当前的数据集合
??curDatas:"",
??type:"get",
??async:false,
??//获取数据
??setType:function(type) {
???this.type=type;
??},
??isAsync:function(async) {
???this.async=async;
??},
??getDatas:function(ul,data) {
???ul+="?t="+Math.random();
???var datas =? $.ajax({
????url:ul ,
????data:data,?
????type:this.type,
???? async: this.async
???}).responseText;
???if(datas.length>0) {
????this.curDatas= jQuery.parseJSON(datas);
????return true;
???}
???return false;
??}
?}

?

/* 借鉴了别人的
******生成js分页脚******
****没剑(2008-03-05)****
修改日期:2008-3-12
添加两个参数:displaynum,displaylastNum可以自由定制显示的页码数量

参数:? pagesize:10? //每页显示的页码数
??????? ,count:0??????????????? //数据条数
??????? ,css:"mj_pagefoot"????? //分页脚css样式类
??????? ,current:1????????????? //当前页码
??,displaynum:7???//中间显示页码数
??,displaylastNum:5??//最后显示的页码数
??????? ,previous:"上一页"????? //上一页显示样式
??????? ,next:"下一页"????????? //下一页显示样式
??????? ,paging:null??????????? //分页事件触发时callback函数
???????
使用:
?$("div").pagefoot({
???? pagesize:10,
???? count:500,
???? css:"mj_pagefoot",
???? previous:"<",
???? next:">",
???? paging:function(page){
?????? alert("当前第"+page+"页");
????? }
?});
?以上代码为所有div加上分页脚代码
*/
jQuery.pagefoot =
{
??? //生成分页脚
??? create:function(_this,s){
???
???
???
??????? var pageCount=0;
??????
??????? //计算总页码
??????? pageCount=(s.count/s.pagesize<=0)?1:(parseInt(s.count/s.pagesize)+((s.count%s.pagesize>0)?1:0));
???????
???????
???????
???????
????????????? if(!$.pagefoot.getPgCount(pageCount,s.getPgCount))
??????????? ?return false;
?????? //检查当前页是否超过最大页
??????? s.current=(s.current>pageCount)?pageCount:s.current
???????
???????
??????? ?//扩展分页
??? ?if(s.extendPage) {
??? ???//下一页是否存在
??? ???var isNext;
??? ?????? //创建下一页
????????? if(s.current>=pageCount){
????????????? strPage+="<span class=\"disabled\">"+s.next+"</span>";
????????????? isNext=false;
????????? }else{
????????????? extendPage.prev.data("curNum",s.current+1);
????????????? isNext=true;
????????? }
???? ???
??? ???
??? ??
??? ?
??? ??return false;
??? ?}
??? ?
??? ?
??????? //循环生成页码
??????? var strPage="";
???????
??????? //创建上一页
??????? if(s.current<=1){
??????????? strPage+="<span class=\"prev-disabled page-bg\">"+s.previous+"</span>";
??????? }else{
??????????? strPage+="<a href=\""+(s.current-1)+"\">"+s.previous+"</a>";
??????? }
???????
???????
??????? //开始的页码
??????? var startP=1;
??????? startP=1
????var anyMore;//页码左右显示最大页码数
????anyMore=parseInt(s.displaynum/2)
??????? //结束的页码
??????? var endP=(s.current+anyMore)>pageCount?pageCount:s.current+anyMore;

??????? //可显示的码码数(剩N个用来显示最后N页的页码)
??????? var pCount=s.pagesize-s.displaylastNum;
??????? if(s.current>s.displaynum){//页码数太多时,则隐藏多余的页码
??????????? startP=s.current-anyMore;
??????????? for(i=1;i<=s.displaylastNum;i++){
??????????????????? strPage+="<a href=\""+i+"\">"+i+"</a>";
??????????? }
??????????? strPage+="...";
??????? }
??????? if(s.current+s.displaynum<=pageCount){//页码数太多时,则隐藏前面多余的页码
??????????? endP=s.current+anyMore;
??????? }else{
??????????? endP=pageCount;
??????? }
??????? for(i=startP;i<=endP;i++){
??????????? if(s.current==i){
??????????????? strPage+="<span class=\"current\">"+i+"</span>";
??????????? }else{
??????????????? strPage+="<a href=\""+i+"\">"+i+"</a>";
??????????? }
??????? }
??????? if(s.current+s.displaynum<=pageCount){//页码数太多时,则隐藏后面多余的页码
??????????? strPage+="...";
??????????? for(i=pageCount-s.displaylastNum+1;i<=pageCount;i++){
??????????????????? strPage+="<a href=\""+i+"\">"+i+"</a>";
??????????? }
??????? }
???????
???????
???????
??????? //创建下一页
??????? if(s.current>=pageCount){
??????????? strPage+="<span class=\"next-disabled page-bg\">"+s.next+"</span>";
??????? }else{
??????????? strPage+="<a href=\""+(s.current+1)+"\">"+s.next+"</a>";
??????? }
????
??????? $(_this).empty().append(strPage).find("a").click(function(){
??????????? //得到翻页的页码
??????????? var ln=this.href.lastIndexOf("/");
??????????? var href=this.href;
??????????? var page=parseInt(href.substring(ln+1,href.length));
??????????? s.current=page;
??????????? //外部取消翻页时...
??????????? if(!$.pagefoot.paging(page,s.paging))
??????????? ?return false;
??????????? $.pagefoot.create(_this,s);
??????????? return false;
??????? });
??????? return this;
??? },
??? paging:function(page,callback){
??????? if(callback){
??????????? if(callback(page)==false)
??????????? return false;
??????? }
??????? return true;
??? },
??? getPgCount:function(count,callback) {
??? ?? if(callback){
??? ?? ?
??????????? if(callback(count)==false)
??????????? return false;
??????? }
??????? return true;
??? }
}
//扩展绑定上下页
jQuery.fn.pagefoot= function(opt)
{
?/*参数定义*/
??? var setting = {pagesize:10? //每页显示的页码数
??????? ,count:0??????????????? //数据条数
??????? ,css:"mj_pagefoot"????? //分页脚css样式类
??????? ,current:1????????????? //当前页码
??,displaynum:3???//中间显示页码数
??,displaylastNum:1??//最后显示的页码数
??????? ,previous:"上一页"????? //上一页显示样式
??????? ,next:"下一页"????????? //下一页显示样式
??????? ,extendPage:null??//扩展分页
??????? ,paging:null
??????? ,getPgCount:null???????? //分页事件触发时callback函数
?};
?opt= opt || {}
?$.extend(setting, opt);
??? return this.each(function(){
??????? $(this).addClass(setting.css);
??????? $.pagefoot.create(this,setting);
??? });
}

?

  相关解决方案