JS重构分页
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);
});
}
});
第二种方式 优点:点击查询按钮后 只发一次请求 请求成功后 初始化分页代码, 再接着写点击某一页的代码,因为还没有点击 所以一开始时候只请求一次。
JS重构分页的更多相关文章
- JAVAEE——BOS物流项目05:OCUpload、POI、pinyin4J、重构分页代码、分区添加、combobox
1 学习计划 1.实现区域导入功能 n OCUpload一键上传插件使用 n 将文件上传到Action n POI简介 n 使用POI解析Excel文件 n 完成数据库操作 n 使用pinyin4J生 ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- 原生JS实现分页效果2.0(新增了上一页和下一页,添加当前元素样式)
虽然写的很烂,但至少全部都是自己写的,因为这个没有固定的顺序,所以就没有封装,如果你技术好的话,可以你写的分享给我,谢谢. <!DOCTYPE html><html lang=&qu ...
- 原生JS实现分页效果1.0
不太完整,写的太急,等等加上完整注释,写起来还是有些难度的,写的有点水,后面再改进改进. <!DOCTYPE html><html lang="en">&l ...
- 纯js实现分页
原理:所有数据已加载好,js通过遍历部分显示,实现分页效果 html代码 <html> <head> <meta charset='utf-8'> <scri ...
- 单篇文章JS模拟分页
废话部分 前两天做了一个前台分页插件,支持ajax读取数据绑定前台 和 url带页码参数跳转两种方式.于是稍加改动,做了一个单篇文章js模拟分页的代码,为什么说是模拟分页呢?因为在服务器响应HTML请 ...
- js前端分页之jQuery
锋利的js前端分页之jQuery 大家在作分页时,多数是在后台返回一个导航条的html字符串,其实在前端用js也很好实现. 调用pager方法,输入参数,会返回一个导航条的html字符串.方法的内部比 ...
- Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页
本博客介绍基于Spring Data这款orm框架加上Jquery.pagination插件实现的分页功能. 介绍一下Spring Data框架 spring Data : Spring 的一个子项目 ...
- 原生js版分页插件
之前我在自己的博客里发表了一篇用angularJs自定义指令实现的分页插件,今天简单改造了一下,改成了原生JavaScript版本的分页插件,可以自定义一些简单配置,特此记录下来.如有不足之处,欢迎指 ...
随机推荐
- java设计模式-----20、模板方法模式
概念: Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. 模板方法模式的应 ...
- Linux常用基本命令(more)
more命令 作用:相比cat一次性显示文件内容,more用于分页显示内容,less比more更强大,大多数的参数类似 more [option] [file] -num : 每页显示num行 +nu ...
- cf900D. Unusual Sequences(容斥 莫比乌斯反演)
题意 题目链接 Sol 首先若y % x不为0则答案为0 否则,问题可以转化为,有多少个数列满足和为y/x,且整个序列的gcd=1 考虑容斥,设\(g[i]\)表示满足和为\(i\)的序列的方案数,显 ...
- 从零开始学习html(十三) CSS代码缩写,占用更少的带宽
一.盒模型代码简写 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&quo ...
- Java 社区平台 - Sym 1.7.0 发布
English | 中文 简介 Symphony([ˈsɪmfəni],n.交响乐)是一个现代化的社区平台,因为它: 实现了面向内容讨论的论坛 包含了面向用户分享.交友.游戏的社交网络 集成了聚合独立 ...
- MySQL数据库图文安装详解及相关问题
(尊重劳动成果,转载请注明出处: http://blog.csdn.net/qq_25827845/article/details/53366444冷血之心的博客) 首先说明:安装目录中不能有中文和空 ...
- php对文件的操作
如何让自己磁盘中的文件夹和目录显示在网页上?那就来看一下,用php是怎么来操作他们的吧 php中文件,一般包含两块内容,文件和目录先来一句一句的看代码,及他的作用 运行后看一下结果 file 指的是文 ...
- json_encode无返回结果
今天写php curl模拟客户端访问测试一个抽奖post数据,拿回来的数据是json,使用json_decode函数就是没结果,百度谷歌好久.终于发现是BOM的文件头造成的, 微软为utf-8文件添加 ...
- sql server对并发的处理-乐观锁和悲观锁(转)
假如两个线程同时修改数据库同一条记录,就会导致后一条记录覆盖前一条,从而引发一些问题. 例如: 一个售票系统有一个余票数,客户端每调用一次出票方法,余票数就减一. 情景: 总共300张票,假设两个售票 ...
- Oracle EBS PO rcv_shipment_headers 数据缺失
Datafix : How to Recreate Missing Receipt or Shipment Header Records (RCV_SHIPMENT_HEADERS table) (D ...