分享一个自己动手写的jQuery分页插件


Posted in Javascript onAugust 28, 2014

工作需要一个JS分页插件,心想自己动手写一个吧,一来上网找一个不清楚代码结构的,出了问题难以解决,而且网上的插件所包含的功能太多,有些根本用不到,就没必要加载那段JS,二来想起没写过jQuery插件,就当练一下手了,好了,先看结果:

 简单说一下这个插件所要实现的功能

 后台将查询出来的内容全部显示到页面上,这个插件要控制这些内容,使其一页一页显示。有上一页,下一页,首页,尾页的功能。在第一页时,上一页,首页要隐藏。在最后一页时,尾页,下一页要隐藏。一次只显示几个按钮,当点击当次最后一个按钮时,显示后面几个。

 接下来简单说一下编码过程:

首先可以大胆的先写下以下的代码:

//为了更好的兼容性,开始前有个分号
;(
function($){//此处将$作为匿名函数的形参
}
)(jQuery)//将jQuery作为实参传递给匿名函数

这段代码大家应该不陌生,就是javascript的神级特性---闭包。这也是jQuery插件的常见结构。为什么要使用闭包来作这jQuery的常用结构呢,一来既可以避免内部临时变量影响全局空间,又可以在插件内部继续使用$作为jQuery的别名。

接下来就是在这个结构里面写自己的方法了,jQuery提供了两种方式可以在jQuery里面扩展方法。打开jQuery API,找到插件机制,可以看到两个方法

• jQuery.extend(object)  扩展jQuery对象本身。用来在jQuery命名空间上增加新函数。
• jQuery.fn.extend(object)  扩展 jQuery 元素集来提供新的方法(通常用来制作插件)。
从上面可以看到jQuery.extend(object)是扩展jQuery本身,要是参照java或者C#这些语言的角度来讲,就相当于向jQuery中添加静态方法。比如说我们这样写:

jQuery.extend({
 "max":function(){
  return max;
 } 
})

这样,就相当于在jQuery对象里面添加了一个max方法,调用的时候可以进行这样调用:jQuery.max()

那么,jQuery.fn是什么呢,打开jQuery源码,可以看到 jQuery.fn = jQuery.prototype。那么jQuery.fn.extend相当于在jQuery中添加成员函数。

这样子应该明白两者之间的区别了吧,静态方法可以直接调用,jQuery.max()。成员函数只有jQuery实例可以调用,比如jQuery("#my").max()。

这里我采用jQuery.extend方法。代码如下:

;(
 function($){
  $.extend({
   "easypage":function(options){
   options = $.extend({//参数设置
   contentclass:"contentlist",//要显示的内容的class
   navigateid:"navigatediv",//导航按钮所在的容器的id
   everycount:"5",//每页显示多少个
   navigatecount:"5"//导航按钮一次显示多少个
   }, options); 
});

easypage就是使用分页插件使用的方法名,contentclass,navigateid,everycount,navigatecount是参数。

基本框架已经搭好了,接下来就是完成功能。

首先是要找到要分页的内容,并生成导航按钮。代码如下:

var currentpage = 0;//当前页 
var contents = $("."+options.contentclass);//要显示的内容
var contentcount = contents.length;//得到内容的个数
var pagecount = Math.ceil(contentcount/options.everycount);//计算出页数
//拼接导航按钮
var navigatehtml = "<div id='pagefirst' class='pagefirst'><a href='javascript:void(0)'>首页</a></div><div id='pagepre' class='pagepre'><a href='javascript:void(0)'>上一页</a></div>";
for(var i = 1;i <= pagecount;i++){
 navigatehtml+='<div class="pagenavigate"><a href="javascript:void(0)">'+i+'</a></div>';
}
navigatehtml+="<div id='pagenext' class='pagenext'><a href='javascript:void(0)'>下一页</a></div><div id='pagelast' class='pagelast'><a href='javascript:void(0)'>尾页</a></div>";
 //加载导航按钮

$("#"+options.navigateid).html(navigatehtml) 

这段代码比较简单,就不多讲。

接下来就是就是实现一些基本的功能,这里抽取其中两个显示

//隐藏所有的导航按钮
$.extend({
"hidenavigates":function(){
//遍历所有的导航按钮
navigates.each(function(){
$(this).hide();
}) 
} 
});
 
//显示导航按钮
$.extend({
"shownavigate":function(currentnavigate){
$.hidenavigates();
//当前按钮如果小于要求一次显示按钮个数的,从0开始显示
var begin = currentnavigate>=options.navigatecount?currentnavigate-parseInt(options.navigatecount):0;
//这里保证从第二页开始,按钮的个数都是2*options.navigatecount
if(begin>navigates.length-2*options.navigatecount){
begin = navigates.length-2*options.navigatecount; 
}
//开始显示
for(var i = begin;i < currentnavigate+parseInt(options.navigatecount);i++){
$(navigates[i]).show();
}
} 
});

 好了,基本的代码流程就是这样了,程序的源代码在附件中,具体的功能实现在源代码注释中已经解释的挺清楚了。对于闭包还有疑问的,可以查看我上一篇博客,谈谈javascript闭包。

下面总结一下jQuery插件的基本要点,呵呵,从锋利的jQuery中摘录出来的。

•插件的文件名推荐为 jquery.[插件名].js,例如jquery.color.js
• 所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上

•在插件内部,this指向的是当前通过选择器获取的jQuery对象,而不像一般的方法那样,例如click()方法,内部的this指向的是DOM元素

•可以通过this.each来遍历所有元素
•所有的方法或函数插件,都应当以分号结尾,否则压缩时可能出问题,有的为了更加稳妥些,在插件的开始处加上一个分号
•插件应该返回一个jQuery对象,这样可以保证插件的可链式操作。除非插件需要返回的是一些需要获取的量,例如字符串或者数组等
•尽量利用闭包技巧历来避免变量名的冲突
 

因为第一次写jQuery插件,可能会有一些地方说的不对,请大家包涵。

Javascript 相关文章推荐
Jquery 弹出层插件实现代码
Oct 24 Javascript
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
Mar 09 Javascript
javascript动态加载三
Aug 22 Javascript
关于Jquery操作Cookie取值错误的解决方法
Aug 26 Javascript
JQuery 图片滚动轮播示例代码
Mar 24 Javascript
jquery获取radio值(单选组radio)
Oct 16 Javascript
javascript三种代码注释方法
Jun 02 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
Oct 10 Javascript
Vue.js Ajax动态参数与列表显示实现方法
Oct 20 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
Jul 28 Javascript
JavaScript Canvas编写炫彩的网页时钟
Oct 16 Javascript
layUI的验证码功能及校验实例
Oct 25 Javascript
jQuery标签替换函数replaceWith()的使用例子
Aug 28 #Javascript
jQuery焦点图切换简易插件制作过程全纪录
Aug 27 #Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
Aug 27 #Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
Aug 27 #Javascript
JavaScript实现的in_array函数
Aug 27 #Javascript
JavaScript AJAX之惰性载入函数
Aug 27 #Javascript
IE浏览器不支持getElementsByClassName的解决方法
Aug 27 #Javascript
You might like
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
jquery分页插件pagination使用教程
2018/10/23 jQuery
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
Python父目录、子目录的相互调用方法
2019/02/16 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
python绘制雷达图实例讲解
2021/01/03 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
亚马逊印度站:Amazon.in
2017/10/15 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
思想政治自我鉴定
2013/10/06 职场文书
《雾凇》教学反思
2014/02/17 职场文书
项目经理任命书范本
2014/06/05 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis
python playwright 自动等待和断言详解
2021/11/27 Python
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL