//page(JSON对象);所有属性见代码中ops
define(function (require, exports, module) {
module.exports= function(os){
//可用配置属性
var ops = {
total:0 //记录数
, page:0 //当前页
, count:0 //或当前记录数
, side:5 //当前页左右数字页个数
, per:5 //每页条数
//模板的值非''才显示,占位符有{=page},{=maxPage},{=total},{=currentPage}
, firstTPL:'<a href="?{=page}">首页</a>' //首页模板
, lastTPL:'<a href="?{=page}">末页</a>' //末页模板
, prevTPL:'<a href="?{=page}">上页</a>' //上页模板
, nextTPL:'<a href="?{=page}">下页</a>' //下页模板
, prevSideTPL:'<a href="?{=page}"><<</a>' //前组模板(快退)
, nextSideTPL:'<a href="?{=page}">>></a>' //后组模板(快进)
, numberTPL:'<a href="?{=page}">{=page}</a>' //页码形式模板
, pageTPL:'<a href="#{=page}">{=page}</a>' //当前页码模板
, jumpTPL:'' //跳转form
};
for (var o in ops)
o in os && (ops[o]=os[o]);
function parseTPL(tpl,json) {
if (!tpl)
return '';
json.maxPage = ops.maxp;
json.total = ops.total;
json.currentPage = ops.page;
return String(tpl).replace(/\{\=(\w+)\}/g,function($0,$1){
return json[$1]||'';
});
}
var pages = '';
(!+ops.per || ops.per < 1) && (ops.per = 5);
if (!+ops.total || ops.total <= ops.per )
return pages;//只有一页
ops.maxp = Math.ceil(ops.total/ops.per);//最大页
//得到当前页码与偏移
if (ops.count > 0) {//使用条数方式
ops.count > ops.total && (ops.count = ops.total);
ops.page = Math.ceil(ops.count/ops.per);//数据位移转换成页,余+1
} else if (ops.page > 1){//页码式
ops.page > ops.maxp && (ops.page = ops.maxp);
ops.count = ops.page*ops.per;
} else {
ops.count = 0;
ops.page = 1;
}
ops.nums = ops.side*2+1;//总数字页为*2+1
console.log(ops);
//首页/上页,左边页面码,page>side出现
if (ops.page > ops.side+1)
pages += parseTPL(ops.firstTPL,{page:1})
+ parseTPL(ops.prevTPL,{page:ops.page-1});
//快退:
var prevp = ops.page - ops.nums;
if (prevp > 1 )
pages += parseTPL(ops.prevSideTPL,{page:prevp});
//中间左边/右边的页码
for (var fi = ops.side, sidel=sider='',pl=pr=ops.page;fi >0; fi--) {
//左边页面码
if (--pl >= 1)
sidel = parseTPL(ops.numberTPL,{page:pl}) + sidel;
//右边页码
if (++pr <= ops.maxp)
sider += parseTPL(ops.numberTPL,{page:pr});
}
pages += sidel
+ parseTPL(ops.pageTPL,{page:ops.page})
+ sider;
//快进按钮
var nextp = ops.page + ops.nums;
if (ops.maxp > nextp )
pages += parseTPL(ops.nextSideTPL,nextp);
//最后的按钮
if (ops.maxp- ops.page > ops.side)
pages += parseTPL(ops.nextTPL,{page:ops.page+1})
+parseTPL(ops.lastTPL,{page:ops.maxp});
//跳转
if (ops.page > ops.side || ops.maxp-ops.page >ops.side)
pages += parseTPL(ops.jumpTPL,{page:ops.page});
return pages;
}
});
使用方法
seajs见seajs.org
或者改写成普通的插件
seajs.use('chrd/page/1.0/page.js#?kdkddddddgdkk',function(p){page = p({total:1000,page:25});console.log(page);})
Object {total: 1000, page: 25, count: 125, side: 5, per: 5…}
<a href="?1">首页</a><a href="?24">上页</a><a href="?14"><<</a><a href="?20">20</a><a href="?21">21</a><a href="?22">22</a><a href="?23">23</a><a href="?24">24</a><a href="#25">25</a><a href="?26">26</a><a href="?27">27</a><a href="?28">28</a><a href="?29">29</a><a href="?30">30</a><a href="?">>></a><a href="?26">下页</a><a href="?200">末页</a>