JS重构分页

很早以前写过一个Jquery分页组件,但是当时写的组件有个缺点,当时的JS插件是这样设计的:比如:点击  -->  查询按钮 ---> 发ajax请求 返回总页数和所有数据,然后拿到总页数去调用我分页代码,去计算共多少页及显示页码按钮,然后在回调成功后,再接着发Ajax请求,把所有的数据请求回来。这样就有一个缺点,每次点击查询按钮后 会连续发2个AJAX请求,对我们前端性能肯定不友好。所以今天晚上对他们重新封装了下,当然以前的逻辑没有变,只是多加了一个配置项及几行代码,初始化的时候换了一种方式初始化。如下JSFiddle

JSFiddle地址如下:点击页码,然后使用火狐或者谷歌控制台查看我打印的数据,嘿嘿!

配置参数如下:

   container
'',   页码容器 默认为空 必填
 perPage  10,     一页多少条数据 默认情况下10条数据
 curIndex  1,      当前的索引 从第几开始 默认从第一页开始
 itemCount  '' ,   记录总数 默认为空 必填 开发需要返回的
 totalPages  0,     共多少页 需要开发返回总数进行计算的
 buttonAmount  10,     每页显示按钮的数量
 isAutoClick  true,     上一页 下一页是否封装在里面作为点击 默认为true       新增的参数。

所有的JS代码如下:

      function Pagination(){

         this.config = {
container : '', // 页码容器
perPage : 10, // 一页多少条数据 默认情况下10条数据
curIndex : 1, // 当前的索引 从第几开始
itemCount : 100, // 记录总数 默认设为100条
totalPages : 0, // 总页数
buttonAmount : 10, // 每页显示按钮的数量
isAutoClick : true // 上一页 下一页是否封装在里面作为点击 默认为true
}; }; Pagination.prototype = { constructor:Pagination, init: function(customConfig,callback){
this.config = $.extend(this.config, customConfig || {});
var _self = this,
_config = _self.config;
_self._query(callback);
return this;
},
_query: function(callback){
var _self = this,
_config = _self.config;
var start,
end,
html = '',
str = '';
_self._calculate();
start = Math.max(1,_config.curIndex - parseInt(_config.buttonAmount/2)); end = Math.min(_config.totalPages,start + _config.buttonAmount - 1); str += '<div class="PagerView">'; // 如果总页数大于1的话
if(_config.totalPages > 1) {
if(_config.curIndex != 1) {
str += '<a href="javascript://1"><span>|<</span></a>';
str += '<a href="javascript://' + (_config.curIndex-1) + '"><span><<</span></a>';
}else {
str += '<span>|<</span>';
str += '<span><<</span>';
}
}
for(var i = start; i <= end; i+=1) {
if(i == _config.curIndex) {
str += '<span class="on">' + i + "</span>";
}else {
str += '<a href="javascript://' + i + '"><span>' + i + "</span></a>";
}
}
if(_config.totalPages > 1){
if(_config.curIndex != _config.totalPages){
str += '<a href="javascript://' + (_config.curIndex+1) + '"><span>>></span></a>';
str += '<a href="javascript://' + _config.totalPages + '"><span>>|</span></a>';
}else{
str += '<span>>></span>';
str += '<span>>|</span>';
}
} str += ' 一共' + _config.totalPages + '页, ' + _config.itemCount + '条记录 '; str += "</div>"; // 把分页放到容器里面
$(_config.container).html(str); if(_config.isAutoClick){
//点击某一项分页的时候
var a_list = $(_config.container + ' a');
for(var i=0; i<a_list.length; i++){
a_list[i].onclick = function(){
var index = $(this).attr('href');
if(index != undefined && index != ''){
index = parseInt(index.replace('javascript://', ''));
_self.click(index,callback);
}
};
}
}
return this;
}, _getSelectValue: function(select){
var idx = select.selectedIndex, //获取选中的索引
option,
value; if(idx > -1) {
option = select.options[idx]; //获取选中的option元素
console.log(option);
value = option.attributes.value;
return (value && value.specified) ? option.value : option.text;
}
return null;
},
click: function(index,callback) {
var _self = this,
_config = _self.config;
_config.curIndex = index;
_self._query(callback);
callback && $.isFunction(callback) && callback(_config);
return this;
}, /**
* 在显示之前计算各种页码变量的值.
*/
_calculate: function(){
var _self = this,
_config = _self.config; // 计算总页数 = parseInt(Math.ceil(记录总数/每页多少条数据),10)
_config.totalPages = parseInt(Math.ceil(_config.itemCount/_config.perPage),10);
_self.curIndex = parseInt(_self.curIndex,10); if(_self.curIndex > _config.totalPages) {
_self.curIndex = _config.totalPages;
}
}
};

调用的方式如下:

1. 第一种还是原来的初始化方式:也就是 isAutoClick参数默认为true 所有的点击在分页代码内部做了处理,缺点:每次点击查询按钮后 会连续发2次ajax请求。sAutoClick

var pager = new Pagination().init({
container: '#pager'
},function(cfg){
console.log(cfg);
});

2. 第二种初始化方式 是刚刚新增的,传参isAutoClick false 然后实例化后 接着在外部调用click事件 做其他的事情,如下:

var pager = new Pagination().init({
container: '#pager',
isAutoClick: false
});
//点击某一项分页的时候
$("#pager").delegate('a','click',function(){
var curIndex = $(this).attr('href');
if(curIndex != undefined && curIndex != ''){
curIndex = parseInt(curIndex.replace('javascript://', ''));
pager.click(curIndex,function(cfg){
console.log(cfg);
});
}
});

第二种方式 优点:点击查询按钮后 只发一次请求 请求成功后 初始化分页代码, 再接着写点击某一页的代码,因为还没有点击 所以一开始时候只请求一次。

DEMO下载

JS重构分页的更多相关文章

  1. JAVAEE——BOS物流项目05:OCUpload、POI、pinyin4J、重构分页代码、分区添加、combobox

    1 学习计划 1.实现区域导入功能 n OCUpload一键上传插件使用 n 将文件上传到Action n POI简介 n 使用POI解析Excel文件 n 完成数据库操作 n 使用pinyin4J生 ...

  2. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  3. 原生JS实现分页效果2.0(新增了上一页和下一页,添加当前元素样式)

    虽然写的很烂,但至少全部都是自己写的,因为这个没有固定的顺序,所以就没有封装,如果你技术好的话,可以你写的分享给我,谢谢. <!DOCTYPE html><html lang=&qu ...

  4. 原生JS实现分页效果1.0

    不太完整,写的太急,等等加上完整注释,写起来还是有些难度的,写的有点水,后面再改进改进. <!DOCTYPE html><html lang="en">&l ...

  5. 纯js实现分页

    原理:所有数据已加载好,js通过遍历部分显示,实现分页效果 html代码 <html> <head> <meta charset='utf-8'> <scri ...

  6. 单篇文章JS模拟分页

    废话部分 前两天做了一个前台分页插件,支持ajax读取数据绑定前台 和 url带页码参数跳转两种方式.于是稍加改动,做了一个单篇文章js模拟分页的代码,为什么说是模拟分页呢?因为在服务器响应HTML请 ...

  7. js前端分页之jQuery

    锋利的js前端分页之jQuery 大家在作分页时,多数是在后台返回一个导航条的html字符串,其实在前端用js也很好实现. 调用pager方法,输入参数,会返回一个导航条的html字符串.方法的内部比 ...

  8. Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页

    本博客介绍基于Spring Data这款orm框架加上Jquery.pagination插件实现的分页功能. 介绍一下Spring Data框架 spring Data : Spring 的一个子项目 ...

  9. 原生js版分页插件

    之前我在自己的博客里发表了一篇用angularJs自定义指令实现的分页插件,今天简单改造了一下,改成了原生JavaScript版本的分页插件,可以自定义一些简单配置,特此记录下来.如有不足之处,欢迎指 ...

随机推荐

  1. 【Mybatis】XML配置实现增删改查

    ①创建数据库和表,数据库为mytest,表为users CREATE DATABASE mytest; USE mytest; DROP TABLE IF EXISTS users; CREATE T ...

  2. jq塞入不同状态html的写法 switch (defaults.type)

    (function($) { //生成一个block function createBlock(options) { var defaults = { type: "1", } v ...

  3. WebSerivce与WebAPI的区别

    一.什么是Web Service Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应 ...

  4. iTerm通过堡垒机自动登录服务器

    为了保障网络和数据安全,越来越多公司使用堡垒机.iTerm作为一个好用的终端利器,要实现自动通过堡垒机登录服务器的方式有多种.下面我就来介绍一种通过expect脚本的方式完成配置. 第一步,进入/us ...

  5. element-ui table

    额,最近有点频繁记录.感觉遇到了很多的问题.然后不断的查,不断的尝试修改.然后得到解决.还是记录关于element-ui的使用.这次是关于表格的使用. 表格使用其实平时用的话也就那么几个属性.虽然官网 ...

  6. Spring学习笔记(一):快速入门

    Spring简介:        Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完 ...

  7. hadoop中实现java网络爬虫

    这一篇网络爬虫的实现就要联系上大数据了.在前两篇java实现网络爬虫和heritrix实现网络爬虫的基础上,这一次是要完整的做一次数据的收集.数据上传.数据分析.数据结果读取.数据可视化. 需要用到 ...

  8. UWP开发细节记录:DirectX::XMMATRIX 的坑

    这两天写的代码概率性的崩溃在 XMMatrixMultiply() 函数,XMMatrixMultiply() 本身是 inline 函数可以看到崩溃处的代码: vX = _mm_mul_ps(vX, ...

  9. Ajax 小实例

    1.urls.py url(r'^jiafa', views.jiafa), 2.views.py def jiafa(request): if request.method == "GET ...

  10. 【转】python version 2.7 required,which was not found in the registry

    源地址:http://www.cnblogs.com/thinksasa/archive/2013/08/26/3283695.html 方法:新建一个register.py 文件,把一下代码贴进去, ...