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版本的分页插件,可以自定义一些简单配置,特此记录下来.如有不足之处,欢迎指 ...
随机推荐
- jquery 简单归纳 -- 前端知识
jquery 什么是jQuery? jquery是轻量级的JavaScript库,核心是javascript,兼容css和各种浏览器,核心理念是写得少做得多(write less do more). ...
- 【读书笔记】iOS-网络-HTTP-URL结构
http://user:password@hostname:port/absolute-path?query. http: 协议 user:password@ 认证 hostname: 主机名 ...
- Spring Boot系列学习文章(一) -- Intellij IDEA 搭建Spring Boot项目
前言: 最近做的一个项目是用Spring Boot来做的,所以把工作中遇到的一些知识点.问题点整理一下,做成一系列学习文章,供后续学习Spring Boot的同仁们参考,我也是第一次接触Spring ...
- 绝版Node--Sequlize搭建服务(Node全栈之路 二)
在Node全栈之路(一),也就是上篇文章中,我们讲到了sequlize的基本增删该查,这篇文章,我们在上篇文章的基础上继续探讨,讲一下关于sequlize创建的表之间的对应关系 参考资料:https: ...
- chrome浏览器快捷键大全
浏览器标签页和窗口快捷键: Ctrl+N 打开新窗口.Ctrl+T 打开新标签页.Ctrl+Shift+N 在隐身模式下打开新窗口.Ctrl+O,然后选择文件. 在 Google Chrome 浏览器 ...
- JavaScript语法详解:运算符和表达式
本文首发于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 我们在上一篇文章里讲到了JS中变量的概念,本篇文章讲一下运算符和表达式. 比 ...
- Oracle EBS INV创建保留
CREATE or REPPLACE PROCEDURE CreateReservation AS -- Common Declarations l_api_version NUMBER := 1.0 ...
- EntityFramework Code-First 简易教程(二)-------Code First约定
Code First 约定 在前一篇中,我们已经知道了EF Code-First怎样从模型类(domain classes)中创建数据库表,下面,我们开始学习默认的Code-First约定. 什么是约 ...
- search文件中的config
config文件中出现这句话时,代表该部分search应写成文件中封装好的search部分.即: var search = null; this.search = search; se ...
- C# post json 匿名类 序列化
//第一步 建立HTTP请求对象 var httpWebRequest = (HttpWebRequest)WebRequest.Create(apiURL); httpWebRequest.Cont ...