前言

最近分页功能使用的比较多,所以从网上下载个jquery分页插件来使用,
之前用的都挺好的,直到昨天出现了逻辑问题,反复查看自己的代码,最后发现是点击页码后执行了多个点击事件。最后只有自己查看源码在做修改。

场景

在同一个页面里多次初始化分页插件,之后点击分页页码时就会出错,原因是:点击后调用多个点击事件,最先调用的点击事件更改了当前页码,之后调用的点击事件使用了更改后的错误的当前页码

解决方法

  • 每次初始化之前让页面重载以清除之前注册的点击事件(然而此种做法弊端太多,不适用)
  • 每次初始化之前解除绑定事件,这就需要查看插件源码了

源码

(function($){var ms = {init:function(obj,args){return (function(){ms.fillHtml(obj,args);ms.bindEvent(obj,args);})();},//填充htmlfillHtml: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: {},//填充htmlfillHtml: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为2console.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;
}

效果图

转载于:https://www.cnblogs.com/scarecrowlxb/p/6760581.html

jquery分页插件的修改相关推荐

  1. html分页插件大全,前端jquery分页插件推荐

    很久没更新文章了,最近项目需要使用前端来做分页,于是找了一款现有的jquery分页插件进行修改了一下,增加了些新功能以及加大了兼容性,其本质其实就是使用$.ajax()方法进行包装,把修改过后的代码贴 ...

  2. java ajax jquery分页插件_JQueryPagination分页插件,ajax从struts请求数据

    2017-07-16 学完了struts2,做了个关于分页的小例子,用到了JQuery分页插件Pagination,先贴下插件下载地址 插件作者对于参数讲解的不够详细,琢磨了半天才明白怎么用,不多说, ...

  3. jquery分页插件-sPage.js使用方法

    git地址:https://github.com/jvbei/sPage 这是一个非常小巧灵活的插件,默认效果也挺好看的.如下: 代码如下: jquery分页插件 1,引入样式文件,可以根据实际需要修 ...

  4. 简单实用的jQuery分页插件twbs-pagination

    在Web开发中,表格是一个很好展示数据的组件.当数据量大了,分页就不可避免了.分页不仅可以提高读取数据的性能,而且也会让用户体验更好.在前面PHP程序员雷雪松给大家介绍了Bootstrap Table ...

  5. jqpaginator用ajax,jquery分页插件jqPaginator

    jqPaginator.js是一款强大的jquery分页插件.该jquery分页插件简洁大方,可以高度自定义,适用于多种场景. 使用方法 在页面中引入jquery和jqPaginator.js文件. ...

  6. java ajax jquery分页插件_分享精心挑选的12款优秀jQuery Ajax分页插件和教程

    摘要:这篇jQuery栏目下的"分享精心挑选的12款优秀jQuery Ajax分页插件和教程",介绍的技术点是"jquery_ajax分页插件.jquery_ajax.a ...

  7. jQuery 分页插件 jPages 使用

    2019独角兽企业重金招聘Python工程师标准>>> jQuery 分页插件 jPage实现了javascript分页.操作很傻瓜,在此记录一下. 使用方式如下: 1.引入头文件( ...

  8. 很强大的一个jquery分页插件

    jQuery.page.js //分页插件 /** ch **/ (function($){var ms = {init:function(obj,args){return (function(){m ...

  9. jQuery分页插件(jquery.page.js)的使用

    效果描述: 不用分页即可显示的jQuery插件 jQuery分页插件--jQuery.page.js用法很简单,效果很棒 1.前端 首先html的head中引入相关css与js <link re ...

最新文章

  1. 【怎样写代码】小技巧 -- 关于引用类型的两种转换方式
  2. IOS遍历未知对象属性、函数
  3. 云网一体,“湘遇湘融 | 移动云TeaTalk·长沙站 启动倒计时
  4. html等待图片全部加载,imgLoad等待图片资源加载完成后执行函数(图片预加载)...
  5. 自动驾驶软件开发人才现状_浅析自动驾驶的重要一环:感知系统发展现状与方向...
  6. 利用lightgbm做learning to rank 排序,解析模型中特征重要度
  7. 光盘装系统和U盘装系统有什么区别吗?
  8. 游戏筑基开发之单链表及其增删改查(C语言)
  9. 孙正义宣布回购55亿美元股票,软银股价创10年最大单日涨幅...
  10. 【工具】Movielens数据集详细介绍
  11. 如何手动彻底消除U盘使用痕迹
  12. 《520婚恋报告》 20%的人婚后都无比后悔
  13. {@link}注解的使用 -------代码注释
  14. 洲际酒店集团与国际青年成就达成全球合作
  15. JAVA+MySQL 图书馆借阅信息管理系统
  16. UED设计流程和方法
  17. 软件项目管理---项目范围管理
  18. 测评 | 谷歌智能耳机Pixel Buds体验:耳朵里的语音助手
  19. 串级PID的一些理解
  20. iPhone游戏开发

热门文章

  1. 收藏 | Yann Lecun纽约大学《深度学习》2020课程笔记中文版
  2. 《Python编程从入门到实践》记录之json模块(数据存储)
  3. 《Python编程从入门到实践》记录之列表切片
  4. INTERSPEECH2020大会收录了哪些论文?
  5. 数据结构(十)二叉排序树
  6. ArcGIS利用数据驱动工具条批量出图(python代码)
  7. 更新计算机上的windows模块安装程序_Win10中用DOS命令也可以完成windows更新,这个技巧还真不知道...
  8. kill 进程_如何查杀stopped进程
  9. Linux采用服务器网址,Linux实现https方式访问站点
  10. 软考网络管理员学习笔记3之第三章网络体系结构