jqPaginator文件
首先创建一个jqPaginator.js文件到你的目录下
jqPaginator.js代码:
(function ($) {
'use strict';
$.jqPaginator = function (el, options) {
if(!(this instanceof $.jqPaginator)){
return new $.jqPaginator(el, options);
}
var self = this;
self.$container = $(el);
self.$container.data('jqPaginator', self);
self.init = function () {
if (options.first || options.prev || options.next || options.last || options.page) {
options = $.extend({}, {
first: '',
prev: '',
next: '',
last: '',
page: ''
}, options);
}
self.options = $.extend({}, $.jqPaginator.defaultOptions, options);
self.verify();
self.extendJquery();
self.render();
self.fireEvent(this.options.currentPage, 'init');
};
self.verify = function () {
var opts = self.options;
if (!self.isNumber(opts.totalPages)) {
throw new Error('[jqPaginator] type error: totalPages');
}
if (!self.isNumber(opts.totalCounts)) {
throw new Error('[jqPaginator] type error: totalCounts');
}
if (!self.isNumber(opts.pageSize)) {
throw new Error('[jqPaginator] type error: pageSize');
}
if (!self.isNumber(opts.currentPage)) {
throw new Error('[jqPaginator] type error: currentPage');
}
if (!self.isNumber(opts.visiblePages)) {
throw new Error('[jqPaginator] type error: visiblePages');
}
if (!opts.totalPages && !opts.totalCounts) {
throw new Error('[jqPaginator] totalCounts or totalPages is required');
}
if (!opts.totalPages && !opts.totalCounts) {
throw new Error('[jqPaginator] totalCounts or totalPages is required');
}
if (!opts.totalPages && opts.totalCounts && !opts.pageSize) {
throw new Error('[jqPaginator] pageSize is required');
}
if (opts.totalCounts && opts.pageSize) {
opts.totalPages = Math.ceil(opts.totalCounts / opts.pageSize);
}
if (opts.currentPage < 1 || opts.currentPage > opts.totalPages) {
throw new Error('[jqPaginator] currentPage is incorrect');
}
if (opts.totalPages < 1) {
throw new Error('[jqPaginator] totalPages cannot be less currentPage');
}
};
self.extendJquery = function () {
$.fn.jqPaginatorHTML = function (s) {
return s ? this.before(s).remove() : $('<p>').append(this.eq(0).clone()).html();
};
};
self.render = function () {
self.renderHtml();
self.setStatus();
self.bindEvents();
};
self.renderHtml = function () {
var html = [];
var pages = self.getPages();
for (var i = 0, j = pages.length; i < j; i++) {
html.push(self.buildItem('page', pages[i]));
}
self.isEnable('prev') && html.unshift(self.buildItem('prev', self.options.currentPage - 1));
self.isEnable('first') && html.unshift(self.buildItem('first', 1));
self.isEnable('statistics') && html.unshift(self.buildItem('statistics'));
self.isEnable('next') && html.push(self.buildItem('next', self.options.currentPage + 1));
self.isEnable('last') && html.push(self.buildItem('last', self.options.totalPages));
if (self.options.wrapper) {
self.$container.html($(self.options.wrapper).html(html.join('')).jqPaginatorHTML());
} else {
self.$container.html(html.join(''));
}
};
self.buildItem = function (type, pageData) {
var html = self.options[type]
.replace(/{{page}}/g, pageData)
.replace(/{{totalPages}}/g, self.options.totalPages)
.replace(/{{totalCounts}}/g, self.options.totalCounts);
return $(html).attr({
'jp-role': type,
'jp-data': pageData
}).jqPaginatorHTML();
};
self.setStatus = function () {
var options = self.options;
if (!self.isEnable('first') || options.currentPage === 1) {
$('[jp-role=first]', self.$container).addClass(options.disableClass);
}
if (!self.isEnable('prev') || options.currentPage === 1) {
$('[jp-role=prev]', self.$container).addClass(options.disableClass);
}
if (!self.isEnable('next') || options.currentPage >= options.totalPages) {
$('[jp-role=next]', self.$container).addClass(options.disableClass);
}
if (!self.isEnable('last') || options.currentPage >= options.totalPages) {
$('[jp-role=last]', self.$container).addClass(options.disableClass);
}
$('[jp-role=page]', self.$container).removeClass(options.activeClass);
$('[jp-role=page][jp-data=' + options.currentPage + ']', self.$container).addClass(options.activeClass);
};
self.getPages = function () {
var pages = [],
visiblePages = self.options.visiblePages,
currentPage = self.options.currentPage,
totalPages = self.options.totalPages;
if (visiblePages > totalPages) {
visiblePages = totalPages;
}
var half = Math.floor(visiblePages / 2);
var start = currentPage - half + 1 - visiblePages % 2;
var end = currentPage + half;
if (start < 1) {
start = 1;
end = visiblePages;
}
if (end > totalPages) {
end = totalPages;
start = 1 + totalPages - visiblePages;
}
var itPage = start;
while (itPage <= end) {
pages.push(itPage);
itPage++;
}
return pages;
};
self.isNumber = function (value) {
var type = typeof value;
return type === 'number' || type === 'undefined';
};
self.isEnable = function (type) {
return self.options[type] && typeof self.options[type] === 'string';
};
self.switchPage = function (pageIndex) {
self.options.currentPage = pageIndex;
self.render();
};
self.fireEvent = function (pageIndex, type) {
return (typeof self.options.onPageChange !== 'function') || (self.options.onPageChange(pageIndex, type) !== false);
};
self.callMethod = function (method, options) {
switch (method) {
case 'option':
self.options = $.extend({}, self.options, options);
self.verify();
self.render();
break;
case 'destroy':
self.$container.empty();
self.$container.removeData('jqPaginator');
break;
default :
throw new Error('[jqPaginator] method "' + method + '" does not exist');
}
return self.$container;
};
self.bindEvents = function () {
var opts = self.options;
self.$container.off();
self.$container.on('click', '[jp-role]', function () {
var $el = $(this);
if ($el.hasClass(opts.disableClass) || $el.hasClass(opts.activeClass)) {
return;
}
var pageIndex = +$el.attr('jp-data');
if (self.fireEvent(pageIndex, 'change')) {
self.switchPage(pageIndex);
}
});
};
self.init();
return self.$container;
};
$.jqPaginator.defaultOptions = {
wrapper: '',
first: '<li class="first"><a href="javascript:;">第一页</a></li>',
prev: '<li class="prev"><a href="javascript:;">上一页</a></li>',
next: '<li class="next"><a href="javascript:;">下一页</a></li>',
last: '<li class="last"><a href="javascript:;">最后一页</a></li>',
page: '<li class="page"><a href="javascript:;">{{page}}</a></li>',
totalPages: 0,
totalCounts: 0,
pageSize: 0,
currentPage: 1,
visiblePages: 7,
disableClass: 'disabled',
activeClass: 'active',
onPageChange: null
};
$.fn.jqPaginator = function () {
var self = this,
args = Array.prototype.slice.call(arguments);
if (typeof args[0] === 'string') {
var $instance = $(self).data('jqPaginator');
if (!$instance) {
throw new Error('[jqPaginator] the element is not instantiated');
} else {
return $instance.callMethod(args[0], args[1]);
}
} else {
return new $.jqPaginator(this, args[0]);
}
};
})(jQuery);
前端页面使用
设置一个标签用来显示分页组件:
例如(必须加id):
<div id="page"></div>
如果两个标签用class的话,会实现联动
可以使用《Bootstrap》里面的样式
例如:引入 Bootstrap 把上面的代码换成:
<div id="page" class="pagination"></div>
就可以改变样式
在本页面引入上面的js文件,并设置:
代码:
<!-- 引入分页插件 -->
<script src="../jqPaginator.js"></script>
<script>
$('#page').jqPaginator({
totalPages: 10,
visiblePages: 6,
currentPage: 1,
onPageChange: function (num, type) {
// $('#text').html('当前第' + num + '页');
if (type == 'change') { //跳到哪里?
location.href = "/admin/article?page=" + num;
}
}
});
</script>
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| totalPages | 0 | 设置分页的总页数 |
| totalCounts | 0 | 设置分页的总条目数 |
| pageSize | 0 | 设置每一页的条目数。注意:要么设置totalPages,要么设置totalCounts + pageSize,否则报错;设置了totalCounts和pageSize后,会自动计算出totalPages。 |
| currentPage | 1 | 设置当前的页码 |
| visiblePages | 7 | 设置最多显示的页码数(例如有100也,当前第1页,则显示1 - 7页) |
| disableClass | 'disabled' | 设置首页,上一页,下一页,末页的“禁用状态”样式 |
| activeClass | 'active' | 设置当前页码样式 |
| first | bootstrap风格 | 设置“首页”的Html结构 |
| prev | bootstrap风格 | 设置“上一页”的Html结构 |
| next | bootstrap风格 | 设置“下一页”的Html结构 |
| last | bootstrap风格 | 设置“末页”的Html结构 |
| page | bootstrap风格 | 设置页码的Html结构,其中可以使用{{page}}代表当前页,{{totalPages}}代表总页数,{{totalCounts}}代表总条目数(例如:上面的“极简风格”的Demo,就是使用了{{占位符}},并将visiblePages设为1实现的。)注意:first、prev、next、last。page只要设置一个,其余未设置的会变为空。 |
| wrapper | 无 | 分页结构的Html包裹,例如:<div class="your class"></div>,一般不会用到 |
| onPageChange | 无 | 回调函数,当换页时触发(包括初始化第一页的时候),会传入两个参数:1、“目标页"的页码,Number类型。2、触发类型,可能的值:“init”(初始化),“change”(点击分页) |
后端返回数据
在前端需要根据数据库里的数据,动态的生成上面有关的参数
例如:totalPages 和 currentPage
在后端返回有关参数到前端,动态生成分页效果