jquery分页插件的修改
前言
最近分页功能使用的比较多,所以从网上下载个jquery分页插件来使用,
之前用的都挺好的,直到昨天出现了逻辑问题,反复查看自己的代码,最后发现是点击页码后执行了多个点击事件。最后只有自己查看源码在做修改。
场景
在同一个页面里多次初始化分页插件,之后点击分页页码时就会出错,原因是:点击后调用多个点击事件,最先调用的点击事件更改了当前页码,之后调用的点击事件使用了更改后的错误的当前页码
解决方法
- 每次初始化之前让页面重载以清除之前注册的点击事件(然而此种做法弊端太多,不适用)
- 每次初始化之前解除绑定事件,这就需要查看插件源码了
源码
(function($){
var ms = {
init:function(obj,args){
return (function(){
ms.fillHtml(obj,args);
ms.bindEvent(obj,args);
})();
},
//填充html
fillHtml:function(obj,args){
return (function(){
obj.empty();
//上一页
if(args.current > 1){
obj.append('<a href="javascript:;" class="prevPage">上一页</a>');
}else{
obj.remove('.prevPage');
obj.append('<span class="disabled">上一页</span>');
}
//中间页码
if(args.current != 1 && args.current >= 4 && args.pageCount != 4){
obj.append('<a href="javascript:;" class="tcdNumber">'+1+'</a>');
}
if(args.current-2 > 2 && args.current <= args.pageCount && args.pageCount > 5){
obj.append('<span>...</span>');
}
var start = args.current -2,end = args.current+2;
if((start > 1 && args.current < 4)||args.current == 1){
end++;
}
if(args.current > args.pageCount-4 && args.current >= args.pageCount){
start--;
}
for (;start <= end; start++) {
if(start <= args.pageCount && start >= 1){
if(start != args.current){
obj.append('<a href="javascript:;" class="tcdNumber">'+ start +'</a>');
}else{
obj.append('<span class="current">'+ start +'</span>');
}
}
}
if(args.current + 2 < args.pageCount - 1 && args.current >= 1 && args.pageCount > 5){
obj.append('<span>...</span>');
}
if(args.current != args.pageCount && args.current < args.pageCount -2 && args.pageCount != 4){
obj.append('<a href="javascript:;" class="tcdNumber">'+args.pageCount+'</a>');
}
//下一页
if(args.current < args.pageCount){
obj.append('<a href="javascript:;" class="nextPage">下一页</a>');
}else{
obj.remove('.nextPage');
obj.append('<span class="disabled">下一页</span>');
}
})();
},
//绑定事件
bindEvent:function(obj,args){
return (function(){
obj.on("click","a.tcdNumber",function(){
var current = parseInt($(this).text());
ms.fillHtml(obj,{"current":current,"pageCount":args.pageCount});
if(typeof(args.backFn)=="function"){
args.backFn(current);
}
});
//上一页
obj.on("click","a.prevPage",function(){
var current = parseInt(obj.children("span.current").text());
ms.fillHtml(obj,{"current":current-1,"pageCount":args.pageCount});
if(typeof(args.backFn)=="function"){
args.backFn(current-1);
}
});
//下一页
obj.on("click","a.nextPage",function(){
var current = parseInt(obj.children("span.current").text());
ms.fillHtml(obj,{"current":current+1,"pageCount":args.pageCount});
if(typeof(args.backFn)=="function"){
args.backFn(current+1);
}
});
})();
}
}
$.fn.createPage = function(options){
var args = $.extend({
pageCount : 15,
current : 1,
backFn : function(){}
},options);
$(this).addClass("component-page");
ms.init(this,args);
}
})(jQuery);
可以看到在绑定事件时使用的是jquery里的on绑定,同时使用了匿名函数;而on绑定属于DOM2级事件绑定,DOM2级事件必须使用removeEventListener来解绑,在jquery里对应的就是off事件
不过值得注意的是解绑时传递的参数必须和绑定时的参数相同,插件中使用匿名函数所以无法解绑。
修改
既然无法解绑那就对插件源码进行修改
思路 :把匿名事件提取出去,同时使用函数名来替代。在绑定之前先进行解绑,可以在bindEvent里进行解绑,不过不符合单一职责原则,所以给ms对象添加一个解绑属性 unbindEvent,在调用bindEvent之前调用 unbindEvent
修改后的代码
(function($){
var ms = {
init:function(obj,args){
//使用parData属性来接受参数,使得参数在提取出来的函数中使用
ms.parData.obj = obj;
ms.parData.args = args;
return (function(){
ms.fillHtml(obj,args);
ms.unbindEvent(obj, args);
ms.bindEvent(obj,args);
})();
},
// 接受参数的属性
parData: {
},
//填充html
fillHtml:function(obj,args){
return (function(){
obj.empty();
//上一页
if(args.current > 1){
obj.append('<a href="javascript:;" class="prevPage">上一页</a>');
}else{
obj.remove('.prevPage');
obj.append('<span class="disabled">上一页</span>');
}
//中间页码
if(args.current != 1 && args.current >= 4 && args.pageCount != 4){
obj.append('<a href="javascript:;" class="tcdNumber">'+1+'</a>');
}
if(args.current-2 > 2 && args.current <= args.pageCount && args.pageCount > 5){
obj.append('<span>...</span>');
}
var start = args.current -2,end = args.current+2;
if((start > 1 && args.current < 4)||args.current == 1){
end++;
}
if(args.current > args.pageCount-4 && args.current >= args.pageCount){
start--;
}
for (;start <= end; start++) {
if(start <= args.pageCount && start >= 1){
if(start != args.current){
obj.append('<a href="javascript:;" class="tcdNumber">'+ start +'</a>');
}else{
obj.append('<span class="current">'+ start +'</span>');
}
}
}
if(args.current + 2 < args.pageCount - 1 && args.current >= 1 && args.pageCount > 5){
obj.append('<span>...</span>');
}
if(args.current != args.pageCount && args.current < args.pageCount -2 && args.pageCount != 4){
obj.append('<a href="javascript:;" class="tcdNumber">'+args.pageCount+'</a>');
}
//下一页
if(args.current < args.pageCount){
obj.append('<a href="javascript:;" class="nextPage">下一页</a>');
}else{
obj.remove('.nextPage');
obj.append('<span class="disabled">下一页</span>');
}
})();
},
//函数部分,注意其中的参数修改了
fun: {
numEvent: function(){
var current = parseInt($(this).text());
ms.fillHtml(ms.parData.obj,{"current":current,"pageCount":ms.parData.args.pageCount});
if(typeof(ms.parData.args.backFn)=="function"){
ms.parData.args.backFn(current);
}
},
prevEvent: function(){
var current = parseInt(ms.parData.obj.children("span.current").text());
ms.fillHtml(ms.parData.obj,{"current":current-1,"pageCount":ms.parData.args.pageCount});
if(typeof(ms.parData.args.backFn)=="function"){
ms.parData.args.backFn(current-1);
}
},
nextEvent: function(){
var current = parseInt(ms.parData.obj.children("span.current").text());
ms.fillHtml(ms.parData.obj,{"current":current+1,"pageCount":ms.parData.args.pageCount});
if(typeof(ms.parData.args.backFn)=="function"){
ms.parData.args.backFn(current+1);
}
}
},
// 解除绑定事件
unbindEvent: function(obj, args) {
return (function(){
obj.off("click","a.tcdNumber",ms.fun.numEvent);
//上一页
obj.off("click","a.prevPage",ms.fun.prevEvent);
//下一页
obj.off("click","a.nextPage",ms.fun.nextEvent);
})();
},
//绑定事件
bindEvent:function(obj,args){
return (function(){
obj.on("click","a.tcdNumber",ms.fun.numEvent);
//上一页
obj.on("click","a.prevPage",ms.fun.prevEvent);
//下一页
obj.on("click","a.nextPage",ms.fun.nextEvent);
})();
}
}
$.fn.createPage = function(options){
var args = $.extend({
pageCount : 15,
current : 1,
backFn : function(){}
},options);
$(this).addClass("component-page");
ms.init(this,args);
}
})(jQuery);
插件使用方式
引入jquery,引入插件(在jquery之后)
编写初始化代码
// commonPage 是页面中的一个元素,用来承载分页部分
$(".commonPage").createPage({
pageCount: Number(count), //总页数,除非是你自己写在这里的数字,否则建议使用Number把它转换成数字
current: Number(current), // 当前页码
backFn: function(p){
//回掉函数,p为点击的页码数 比如点击2则p为2
console.log(p);
}
});
特别说明分页样式需要自己写,下面贴出我的样式
/* 分页组件中的样式,component-page是分页插件自动添加上去的类名*/
.component-page a {
text-decoration: none;
}
.component-page a:hover {
text-decoration: none;
}
.component-page {
padding: 15px 20px;
text-align: left;
color: #ccc;
text-align: center;
}
.component-page a {
display: inline-block;
color: #428bca;
display: inline-block;
height: 25px;
line-height: 25px;
padding: 0 10px;
border: 1px solid #ddd;
margin: 0 2px;
border-radius: 4px;
vertical-align: middle;
}
.component-page a:hover {
text-decoration: none;
border: 1px solid #428bca;
}
.component-page span.current {
display: inline-block;
height: 25px;
line-height: 25px;
padding: 0 10px;
margin: 0 2px;
color: #fff;
background-color: #428bca;
border: 1px solid #428bca;
border-radius: 4px;
vertical-align: middle;
}
.component-page span.disabled {
display: inline-block;
height: 25px;
line-height: 25px;
padding: 0 10px;
margin: 0 2px;
color: #bfbfbf;
background: #f2f2f2;
border: 1px solid #bfbfbf;
border-radius: 4px;
vertical-align: middle;
}
效果图

jquery分页插件的修改的更多相关文章
- 一个强大的jquery分页插件
点击这里查看效果 这个分页插件使用方便,引用keleyidivpager.js和keleyidivpager.css文件,然后在htm(或者php,aspx,jsp等)页面中对分页总数,参数名,前缀后 ...
- 21个很棒的jQuery分页插件下载
分页是指将一个大内容划分为各种不同的页面,因此网站的分页是一个很重要的部分,必须让内容有组织性和易于访问.分页有各两种不同的方式,手动跟自动.最受欢迎简单和广泛的方法是jQuery插件.下面我们收集了 ...
- jQuery 分页插件 jqPagination的使用
jqPagination 是一个简单易用的轻量级 jQuery分页插件,其使用了 HTML5 和 CSS3 技术来实现.此插件提供了几个参数设置选项,通过简单的配置即可生成分页控件.此外,它的外观样式 ...
- Jquery 分页插件 Jquery Pagination
Jquery 分页插件 Jquery Pagination 分页插件来说,我觉得适用就行,尽量简单然后能够根据不同的应用场景能够换肤.展现形式等. 对于初学者想写分页插件的同学,也可以看下源码,代码也 ...
- jQuery分页插件(jquery.page.js)的使用
效果描述: 不用分页即可显示的jQuery插件 jQuery分页插件——jQuery.page.js用法很简单,效果很棒 1.前端 首先html的head中引入相关css与js <lin ...
- 20个jQuery分页插件和教程
1.客户端的jQuery 分页插件jPages jPages 是一个客户端的分页插件,但提供很多特性例如自动翻页.键盘和滚动浏览,延迟显示以及完全可定制的导航面板. Read More Demo 2. ...
- 自己diy一个jquery分页插件
js基础学习过程中,期间经历换工作的各种面试,很多面试官问过:有没有写过jquery插件?等类似问题. 就个人而言,关于jquery插件的文章确实看过不少,但是一直没有动手写一个,一是不想在目前学习j ...
- 分享一个Jquery 分页插件 Jquery Pagination
分页插件来说,我觉得适用就行,尽量简单然后能够根据不同的应用场景能够换肤.展现形式等. 对于初学者想写分页插件的同学,也可以看下源码,代码也挺简单明了的,也助于自己写个小插件. 不过我比较懒,一般直接 ...
- JQuery分页插件封装(源码来自百度,自己封装)
最近由于项目的需要,做了一个基于JQuery的表格分页插件封装,部分源码来源百度,经由自己封装完成. 下面是具体代码和说明,仅供参考.第一步可以先将我的HTML,CSS,JS这三部分的代码创建好后先运 ...
随机推荐
- AR入门系列-07-Vuforia柱形体识别
今天为大家带来Vuforia柱形体识别的使用教程 首先我们要进入Vuforia官网在TargetManager中添加Target,这次我们添加的类型为Cylinder圆柱 Bottom Diamete ...
- yaourt 之 Curl 错误
最近执行 yaourt 更新时总是出现以下错误: curl error: Couldn't connect to server 无法进行更新.把配置中的下载工具更换了成 axel 等其它下载工具,还是 ...
- NSTimer的精确度
1.iOS中一般UI上面常用两种定时器 NSTimer和CADisplayLink,那么它们分别的精确度是如何呢? CADisplayLink 是用于帧刷新定时器,也就是和界面的刷新率保持一致,理想情 ...
- IE浏览器img不显示解决
下面的只是一个我们在网页中插入一个图片的简单例子,浏览的时候我们也没有任何问题 <!doctype html> <html> <head> <meta cha ...
- Array对象
1. Array定义 Array是可以保存任意变量的.也就是说,第一项可以是一个基本类型,第二项就可以是一个引用类型,长度也是根据内容动态增加的 var arr = new Array(); 当 ...
- Linux系统启动过程详解
启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...
- 防火墙之netfailt、iptables详解
[TOC] Iptables入门 # 1.iptables介绍 linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成. netfilter 组件也称为 ...
- lvm的vg扩容
本次扩容的目的是要扩展 / 的整体容量,具体操作如下: 1.首先查看是否存在未分配的磁盘 [root@NH-Test-44 ~]# fdisk -l Disk /dev/vda: 53.7 GB, 5 ...
- 零基础入门学习UI设计指南
第一步:认识设计启蒙必备知识 学习一项技能,尤其是已经有一定沉淀并在各行各业有广泛应用的技能,就一定要对它先有充分的认知.在开始正式学习前,你需要花足够的经历去了解和查阅它的起源.发展.应用.未来. ...
- RegExp类型(正则表达式)
直接量语法 /pattern/attributes 创建 RegExp 对象的语法: new RegExp(pattern, attributes); 一.attributes: 修饰符 描述 i 执 ...