分页功能已经封装成一个独立的js文件,也是用bs完成的,名称为bootstrap-paginator.js。

使用前先导入文件 :

<script src="../libs/bootstrap/3.3.7/bootstrap-paginator.js"></script>

演示代码:

<body>
<div class="container">
<p>分页</p>
<ul id="page"></ul>
</div>
</body>
<script>
$(function() {
var currentPage = 1;
var totalPages = 2;
$("#page").bootstrapPaginator({
bootstrapMajorVersion: 3, //对应的bootstrap版本
currentPage: currentPage, //当前页数
numberOfPages: 10, //每次显示页数
totalPages: totalPages, //总页数
shouldShowPage: true, //是否显示该按钮
useBootstrapTooltip: true,
onPageClicked: function(event, originalEvent, type, page) {
console.log(page);
}
});
});
</script>

效果图:

bootstrap-paginator.js文件源码:

(function($) {
"use strict";
/**
* Bootstrap分页构造函数
*
* @param 分页的容器对象
* @param 分页的相关配置
*
* */
var BootstrapPaginator = function(element, options) {
this.init(element, options);
},
old = null;

BootstrapPaginator.prototype = {

/**
* 分页初始化, 把element和options作为参数
*
* @param element 分页的容器对象
* @param options 分页的相关配置
*
* */
init: function(element, options) {

this.$element = $(element);

var version = (options && options.bootstrapMajorVersion) ? options.bootstrapMajorVersion : $.fn.bootstrapPaginator.defaults.bootstrapMajorVersion,
id = this.$element.attr("id");
if(version === 2 && !this.$element.is("div")) {
throw "在Bootstrap2中,必须使用div作为分页的容器";
} else if(version > 2 && !this.$element.is("ul")) {
throw "在Bootstrap3中,必须使用ul作为分页的容器"
}
this.currentPage = 1;
this.lastPage = 1;
this.setOptions(options);
this.initialized = true;
},

/**
* 更新分页element的属性
*
* @param 分页的相关配置
* */
setOptions: function(options) {

this.options = $.extend({}, (this.options || $.fn.bootstrapPaginator.defaults), options);

this.totalPages = parseInt(this.options.totalPages, 10); //设置总页数
this.numberOfPages = parseInt(this.options.numberOfPages, 10); //设置要显示的页数

//设置总页数后移除当前页设置,否则会导致页面异常
if(options && typeof(options.currentPage) !== 'undefined') {

this.setCurrentPage(options.currentPage);
}

this.listen();

//呈现分页
this.render();

if(!this.initialized && this.lastPage !== this.currentPage) {
this.$element.trigger("page-changed", [this.lastPage, this.currentPage]);
}

},

/**
* 设置时间监听器,如果可用的话,页面点击和切换事件是关联的
*
* */
listen: function() {

this.$element.off("page-clicked");

this.$element.off("page-changed"); // 卸载元素事件

if(typeof(this.options.onPageClicked) === "function") {
this.$element.bind("page-clicked", this.options.onPageClicked);
}

if(typeof(this.options.onPageChanged) === "function") {
this.$element.on("page-changed", this.options.onPageChanged);
}

this.$element.bind("page-clicked", this.onPageClicked);
},

/**
*
* 销毁paginator元素,首先卸载事件,然后清空里面的内容。
*
* */
destroy: function() {

this.$element.off("page-clicked");

this.$element.off("page-changed");

this.$element.removeData('bootstrapPaginator');

this.$element.empty();

},

/**
* 显示分页
*
* */
show: function(page) {

this.setCurrentPage(page);

this.render();

if(this.lastPage !== this.currentPage) {
this.$element.trigger("page-changed", [this.lastPage, this.currentPage]);
}
},

/**
* 显示下一页
*
* */
showNext: function() {
var pages = this.getPages();

if(pages.next) {
this.show(pages.next);
}

},

/**
* 显示上一页
*
* */
showPrevious: function() {
var pages = this.getPages();

if(pages.prev) {
this.show(pages.prev);
}

},

/**
* 显示第一页
*
* */
showFirst: function() {
var pages = this.getPages();

if(pages.first) {
this.show(pages.first);
}

},

/**
* 显示最后一页
*
* */
showLast: function() {
var pages = this.getPages();

if(pages.last) {
this.show(pages.last);
}

},

/**
* 页码单击处理程序,单击页码时,将当前页更改为相应的页面,并触发监听器的pageClick事件
*
*
* */
onPageItemClicked: function(event) {

var type = event.data.type,
page = event.data.page;

this.$element.trigger("page-clicked", [event, type, page]);

},
/**
* 点击跳转事件
* @param event
*/
onPageItemJumped: function(event) {
var type = event.data.type;
var value = this.$element.find('input').val();
var page = parseInt(value, 10);
if(!isNaN(value) && page > 0 && page != this.currentPage && page <= this.totalPages) {
this.$element.trigger("page-clicked", [event, type, page]);
}
},
onPageClicked: function(event, originalEvent, type, page) {
//显示相应页面,并在事件返回之前检查新建的页面
var currentTarget = $(event.currentTarget);
switch(type) {
case "first":
currentTarget.bootstrapPaginator("showFirst");
break;
case "prev":
currentTarget.bootstrapPaginator("showPrevious");
break;
case "next":
currentTarget.bootstrapPaginator("showNext");
break;
case "last":
currentTarget.bootstrapPaginator("showLast");
break;
case "page":
currentTarget.bootstrapPaginator("show", page);
break;
case "jump":
currentTarget.bootstrapPaginator("show", page);
break;
}
},
/**
* 根据内部属性和设置呈现分页(生成分页主函数,要修改分页的生成主要就在这里)
*
*
* */
render: function() {
//获取容器class并将其添加到容器中
var containerClass = this.getValueFromOption(this.options.containerClass, this.$element),
size = this.options.size || "normal",
alignment = this.options.alignment || "left",
pages = this.getPages(),
listContainer = this.options.bootstrapMajorVersion === 2 ? $("<ul></ul>") : this.$element,
listContainerClass = this.options.bootstrapMajorVersion === 2 ? this.getValueFromOption(this.options.listContainerClass, listContainer) : null,
first = null,
prev = null,
next = null,
last = null,
p = null,
i = 0;

this.$element.prop("class", "");

this.$element.addClass("pagination");

switch(size.toLowerCase()) {
case "large":
case "small":
case "mini":
this.$element.addClass($.fn.bootstrapPaginator.sizeArray[this.options.bootstrapMajorVersion][size.toLowerCase()]);
break;
default:
break;
}

if(this.options.bootstrapMajorVersion === 2) {
switch(alignment.toLowerCase()) {
case "center":
this.$element.addClass("pagination-centered");
break;
case "right":
this.$element.addClass("pagination-right");
break;
default:
break;
}
}

this.$element.addClass(containerClass);

//清空最外面的容器,然后把列表添加进容器中。
this.$element.empty();

if(this.options.bootstrapMajorVersion === 2) {
this.$element.append(listContainer);

listContainer.addClass(listContainerClass);
}

//更新页面元素引用
this.pageRef = [];

if(pages.first) { //如果是第1页
first = this.buildPageItem("first", pages.first);
if(first) {
listContainer.append(first);
}

}

if(pages.prev) { //如果是上一页
prev = this.buildPageItem("prev", pages.prev);
if(prev) {
listContainer.append(prev);
}

}

for(i = 0; i < pages.length; i = i + 1) { //填写数字
p = this.buildPageItem("page", pages[i]);
if(p) {
listContainer.append(p);
}
}
if(pages.next) { //如果是下一页
next = this.buildPageItem("next", pages.next);
if(next) {
listContainer.append(next);
}
}
if(pages.last) { //如果是最后一页
last = this.buildPageItem("last", pages.last);
if(last) {
listContainer.append(last);
}
}
//新加的
var itemCustom = $("<li></li>"); //创建一个容器
var itemHtml = "<span><input type='text' style='width: 30px;height: 20px;' value='" + this.currentPage + "'/> / " + this.totalPages + "</span>";
itemCustom.append(itemHtml);
listContainer.append(itemCustom);
var itemlast = $("<li></li>"); //创建一个‘跳转’的span
var itemTz = $("<span style='cursor: pointer;'>跳转</span>").on("click", null, {
type: 'jump'
}, $.proxy(this.onPageItemJumped, this)); //绑定点击事件
itemlast.append(itemTz);
listContainer.append(itemlast);
},

/**
*
* 根据给定的类型和页码创建page
*
* @param page 页码
* @param type 类型(first, prev, page, next, last)
*
* @return 构造的页面元素
* */
buildPageItem: function(type, page) {
var itemContainer = $("<li></li>"), //创建一个容器
itemContent = $("<a style='cursor: pointer;'></a>"), //创建一个内容
text = "",
title = "",
itemContainerClass = this.options.itemContainerClass(type, page, this.currentPage),
itemContentClass = this.getValueFromOption(this.options.itemContentClass, type, page, this.currentPage),
tooltipOpts = null;

switch(type) {
case "first":
itemContainerClass = "";
if(!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) {
return;
}
text = this.options.itemTexts(type, page, this.currentPage);
title = this.options.tooltipTitles(type, page, this.currentPage);
break;
case "last":
itemContainerClass = "";
if(!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) {
return;
}
text = this.options.itemTexts(type, page, this.currentPage);
title = this.options.tooltipTitles(type, page, this.currentPage);
break;
case "prev":
itemContainerClass = "";
if(!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) {
return;
}
text = this.options.itemTexts(type, page, this.currentPage);
title = this.options.tooltipTitles(type, page, this.currentPage);
break;
case "next":
itemContainerClass = "";
if(!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) {
return;
}
text = this.options.itemTexts(type, page, this.currentPage);
title = this.options.tooltipTitles(type, page, this.currentPage);
break;
case "page":
if(!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) {
return;
}
text = this.options.itemTexts(type, page, this.currentPage);
title = this.options.tooltipTitles(type, page, this.currentPage);
break;
}

itemContainer.addClass(itemContainerClass).append(itemContent);

itemContent.addClass(itemContentClass).html(text).on("click", null, {
type: type,
page: page
}, $.proxy(this.onPageItemClicked, this));

if(this.options.pageUrl) {
itemContent.attr("href", this.getValueFromOption(this.options.pageUrl, type, page, this.currentPage));
}

if(this.options.useBootstrapTooltip) {
tooltipOpts = $.extend({}, this.options.bootstrapTooltipOptions, {
title: title
});
itemContent.tooltip(tooltipOpts);
} else {
itemContent.attr("title", title);
}
return itemContainer;
},

setCurrentPage: function(page) {
if(page > this.totalPages || page < 1) { // 如果当前页码超出范围,则抛出异常
throw "页码超出范围";
}
this.lastPage = this.currentPage;
this.currentPage = parseInt(page, 10);
},
/**
* 获取表示页面对象当前状态的数组。
*
* @return 输出具有first, prev, next, last和中间页码的对象.
* */
getPages: function() {
var totalPages = this.totalPages, //通过总记录获取或计算总页数
pageStart = (this.currentPage % this.numberOfPages === 0) ? (parseInt(this.currentPage / this.numberOfPages, 10) - 1) * this.numberOfPages + 1 : parseInt(this.currentPage / this.numberOfPages, 10) * this.numberOfPages + 1, //calculates the start page.
output = [],
i = 0,
counter = 0;
pageStart = pageStart < 1 ? 1 : pageStart; //检查页面的开始范围,看它是否小于1。
for(i = pageStart, counter = 0; counter < this.numberOfPages && i <= totalPages; i = i + 1, counter = counter + 1) { //填写页面
output.push(i);
}
output.first = 1; //在当前页面离开第一页时添加first
if(this.currentPage > 1) { // 在当前页面离开第一页时添加prev
output.prev = this.currentPage - 1;
} else {
output.prev = 1;
}

if(this.currentPage < totalPages) { // 当前页不是最后一页时添加next
output.next = this.currentPage + 1;
} else {
output.next = totalPages;
}
output.last = totalPages; // 在当前页面没有达到最后一页时添加last
output.current = this.currentPage; //标记当前页面
output.total = totalPages;
output.numberOfPages = this.options.numberOfPages;
return output;
},
/**
* 从选项中获取值,这是为了处理其中value是函数的返回值的情况。
*
* @return 混合值取决于参数的类型,如果给定参数是函数,则返回评估结果。 否则参数本身将返回。
* */
getValueFromOption: function(value) {
var output = null,
args = Array.prototype.slice.call(arguments, 1);
if(typeof value === 'function') {
output = value.apply(this, args);
} else {
output = value;
}
return output;
}
};
old = $.fn.bootstrapPaginator;
$.fn.bootstrapPaginator = function(option) {
var args = arguments,
result = null;
$(this).each(function(index, item) {
var $this = $(item),
data = $this.data('bootstrapPaginator'),
options = (typeof option !== 'object') ? null : option;
if(!data) {
data = new BootstrapPaginator(this, options);
$this = $(data.$element);
$this.data('bootstrapPaginator', data);
return;
}
if(typeof option === 'string') {
if(data[option]) {
result = data[option].apply(data, Array.prototype.slice.call(args, 1));
} else {
throw "Method " + option + " does not exist";
}
} else {
result = data.setOptions(option);
}
});
return result;
};
$.fn.bootstrapPaginator.sizeArray = {
"2": {
"large": "pagination-large",
"small": "pagination-small",
"mini": "pagination-mini"
},
"3": {
"large": "pagination-lg",
"small": "pagination-sm",
"mini": ""
}
};
$.fn.bootstrapPaginator.defaults = {
containerClass: "",
size: "normal",
alignment: "left",
bootstrapMajorVersion: 2,
listContainerClass: "",
itemContainerClass: function(type, page, current) {
return(page === current) ? "active" : "";
},
itemContentClass: function(type, page, current) {
return "";
},
currentPage: 1,
numberOfPages: 5,
totalPages: 1,
pageUrl: function(type, page, current) {
return null;
},
onPageClicked: null,
onPageChanged: null,
useBootstrapTooltip: false,
shouldShowPage: function(type, page, current) {
var result = true;
switch(type) {
case "first":
result = (current !== 1);
break;
case "prev":
result = (current !== 1);
break;
case "next":
result = (current !== this.totalPages);
break;
case "last":
result = (current !== this.totalPages);
break;
case "page":
result = true;
break;
}
return result;
},
itemTexts: function(type, page, current) {
switch(type) {
case "first":
return "首页";
case "prev":
return "上一页";
case "next":
return "下一页";
case "last":
return "末页";
case "page":
return page;
}
},
tooltipTitles: function(type, page, current) {
switch(type) {
case "first":
return "首页";
case "prev":
return "上一页";
case "next":
return "下一页";
case "last":
return "末页";
case "page":
return(page === current) ? "当前是第" + page + "页" : "第" + page + "页";
}
},
bootstrapTooltipOptions: {
animation: true,
html: true,
placement: 'top',
selector: false,
title: "",
container: false
}
};
$.fn.bootstrapPaginator.Constructor = BootstrapPaginator;
}(window.jQuery));

响应式前端框架Bootstrap系列(11)分页的更多相关文章

  1. Foundation 5 发布!最先进的响应式前端框架

    数以百万计的设计师和工程师采用 Foundation 作为他们的产品和网站设计的前端框架.Foundation 是第一个响应式.语义化和移动优先的开源框架.最新发布的 Foundation 5 是最先 ...

  2. 2016国内最值得期待的响应式前端框架pintuer(拼图)--http://www.pintuer.com

    近期,需要将项目从pc端的应用扩展到移动端. 当然移动框架的第一选择必然是bootstrap,但是bootstrap作为移动端明显过于死板,而且作为国外的产品,对于国内的应用明显水土不服.框架里总有那 ...

  3. Crumpet – 使用很简单的响应式前端开发框架

    Crumpet 是一个简单的响应式的基于 SASS/SCSS 的响应式前端框架,保持你的 HTML 代码简洁.内置尽量使用占位符选择器,以减少你的 HTML 标记的大小,没有凌乱的 HTML 代码.快 ...

  4. bootstrap响应式前端页面

    技术:HTML+CSS+JS+bootstrap   概述 这套代码响应式前端页面基本写完了,适合初学前端的同学,里面主要运用了HTML+CSS布局和动画,js逻辑较少,页面都是静态,未接入接口.响应 ...

  5. 响应式开发(二)-----Bootstrap框架的介绍

    简介 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架,是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的, ...

  6. 16个最佳响应式HTML5框架分享

    HTML5框架可以快速构建响应式网站,它们帮助程序员减少编码工作,减少冗余的代码.如今有很多免费的HTML5框架可供使用,由于它们有着响应式设计.跨浏览器兼容.相对轻量级等特点,这些框架在开发中都十分 ...

  7. Furatto – 轻量,友好的响应式前端开发框架

    Furatto 是一个基于 Bootstrap & Foundation 的前端开发框架,用于快速开发网站.这个框架采用流行的扁平化设计和响应式设计.除了布局和网格之外,所有的主要元素都有预定 ...

  8. 前端框架 bootstrap 的使用

    内容概要 前端框架 bootstrap 简介 引入方式 布局容器 栅格系统 图标 内容详细 简介 网址:https://v3.bootcss.com/ 版本: 2.X 3.X 4.X 推荐使用3.X版 ...

  9. Flex box弹性布局 及 响应式前端设计的优化

    Flex box弹性布局 Flex box是CSS3新添加的一种模型属性,它的出现有力的打破了我们常常使用的浮动布局.实现垂直等高.水平均分.按比例划分,可以实现许多我们之前做不到的自适应布局.如果你 ...

随机推荐

  1. 在mac中,npm安装或者卸载失败,提示没有权限

    在终端输入 sudo chown -R $USER /usr/local 输入开机密码

  2. JavaWeb之上传与下载

    文件上传概述: 1,文件上传对页面的要求: 必须使用表单,而不能是超链接 表单的method必须是post 表单的enctype必须是multipart/form-data 在表单中添加file表单字 ...

  3. 关于 oracle10g、oracle client和plsql devement 三者之间的关系

    oracle10g是服务器,如果本机安装了oracle10g,没有必要安装oracle client,只要配置好DNS,就可以使用plsql devement连接     当然你也可以同时安装orac ...

  4. Running .sh scripts in Git bash

    Running .sh scripts in Git bash Let's say you have a script script.sh. To run it (using Git Bash), y ...

  5. leetcode-easy-others-190. Reverse Bits-NO

    mycode 不会... 参考: 1. 思路: 将十进制的n转换成二进制(str) -> 利用切片.反向获取不包含0b的反转后的二进制字符串 -> 补上0(共32位) 2. class S ...

  6. Win7、win8、win10下实现精准截获Explorer拷贝行为

    介绍了windows下对Explorer的拷贝动作的精确截获,这个在企业数据安全dlp产品系列中减少审计的噪音很有效,方便运营人员做针对性的审计. 在企业数据安全中我通常需要监测用户的拷贝行为,特别像 ...

  7. [mysql]SQL语句-新增/修改 创建时间 更新时间

    SQL关键词 要注意大小写   已建表,之前没有创建时间列, 现新增1列创建时间,并设置默认值为当前时间 --添加CreateTime 设置默认时间 CURRENT_TIMESTAMP ALTER T ...

  8. JavaScript日常学习4

    JavaScript事件 1.<button id="btn1" onclick="document.getElementById("btn1" ...

  9. 51N皇后

    题目:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击.给定一个整数 n,返回所有不同的 n 皇后问题的解决方案.每一种解法包含一个明确的 n 皇后问题的 ...

  10. flex label如何通过AS3实现颜色设置

    如果你想修改label的颜色,你可以在控件上面直接设置color属性,但是有这样一个情况,有些label的颜色是动态设置的,没办法一开始初始化的时候设置 这个时候就需要在AS当中动态的设置,直接.se ...