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 面试中遇到的坑
Java开发中很多人都不愿意修改自己以前的代码,看别人的代码更是无法忍受,当看到别人代码里面一些匪夷所思的写法实现时,恨不得找到负责人好好跟他谈谈心,那么你在开发中是不是也使用到以下几种实现呢. 1. ...
- HDU2255(KB10-K 二分图最大权匹配)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- mysql时间与字符串之间相互转换
1.时间转字符串 DATE_FORMAT(日期,格式字符串) SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); 2.字符串转时间 STR_TO_DATE( ...
- Kubernetes+Docker的云平台在CentOS7系统上的安装
Kubernetes+Docker的云平台在CentOS7系统上的安装 1.运行VirtualBox5. 2.安装CentOS7系统. 注意:选择Basic Server类型 安装过程略. 3.修改计 ...
- android展示注册进度效果源码
- Android--根据子控件的大小自动换行的ViewGroup
1.自定义ViewGroup /** * Created by Administrator on 2016/2/26. * * --------自动换行的ViewGroup----------- */ ...
- Mac日常使用问题
问题一: macbook如何关闭safari左侧书签栏? 方法1: 快捷键:control+command+1键 办法2: 把光标移到safari顶部, 菜单单出来后, 选择view-->sho ...
- 使用托管快照创建作为 Azure 托管磁盘存储的 VHD 的副本
创建快照 创建 OS 或数据磁盘 VHD 的快照,以便将其用作备份或用于排查 VM 问题. 快照是 VHD 的完整只读副本. 使用 Azure 门户创建快照 登录到 Azure 门户. 首先在左上角单 ...
- Oracle EBS CST 成本请求报错
(文档 ID 430533.1) When running CMCPAW, Periodic Actual Cost Worker, an error is received in the logf ...
- 大数据开发实战:HDFS和MapReduce优缺点分析
一. HDFS和MapReduce优缺点 1.HDFS的优势 HDFS的英文全称是 Hadoop Distributed File System,即Hadoop分布式文件系统,它是Hadoop的核心子 ...