使用jQuery.fn自定义jQuery翻页插件


Posted in Javascript onJanuary 20, 2013

第一次写jQuery插件。自己感觉写的也不怎么样。写jQuery插件利用的就是这个东东 jQuery.fn,例如
使用jQuery.fn自定义jQuery翻页插件

jQuery.fn.pluginName=function(){};

这个是我写的分页插件的样子
插件通过一个外放的函数来进行翻页操作,无论是点击前进、后退、还是改变页面大小,都会调用该函数。
先看看插件的代码结构
(function ($) { 
//存放插件所需的属性字段 
var PagerFields = { 
}; 
//插件的私有函数 
function setImageButtonSate() { 
} 
//插件的公共函数 
var methods = { 
_pagerFields: null, 
ini: function (options) { 
}, 
destory: function (options) { 
return $(this).each(function () { 
var $this = $(this); $this.removeData('HGPager2'); 
}); 
} 
}; 
//定义插件 
$.fn.HGPager2 = function () { 
var method = arguments[0]; 
if (methods[method]) { 
method = methods[method]; 
arguments = Array.prototype.slice.call(arguments, 1); 
} 
else if (typeof (method) == 'object' || !method) { 
method = methods.ini; 
} 
else { 
$.error('Method ' + method + ' does not exist on jQuery.pluginName'); 
return this; 
} 
return method.apply(this, arguments); 
}; 
})(jQuery);

这个结构是按照《深入理解jQuery插件开发》文中的模式(这篇文章个人感觉不错的,一开始学习写插件的朋友建议先看看这篇文章)。整个插件的定义、以及它的私有变量函数都被包在$(function(){});里面了。用这种方式即可以保护插件私有变量的安全性,从另一个角度看也可以避免了变量名重复而导致的麻烦。如果把私有变量放在$.fn.HGPager2 = function () {}这个函数里面的话,会有弊端,要是插件外放了一些函数来获取插件的一些参数信息(如当前的页码,当前页大小诸如此类)就不能获取到确切的参数信息。因为根据js的作用域理论之前构造插件时的参数信息与后来调用函数进入的作用域是不一样的。上面的这种模式,就确保了构造插件与调用插件函数时进入的作用域是一样的。
下面再列举插件的各个部分
这是插件的私有变量,用一个PagerFields类来存放。
var PagerFields = { 
pageSize: 10, //页面大小 
pageCount: 0,//页面数量 
recordCount: 0,//记录总数 
currentPage: 0,//当前页码 
pagerFunction: null //翻页时触发的调用的函数,用于读取数据。 
};

这个是插件的私有函数,用于设置翻页按钮的状态(按钮的图片没有上传,若是把代码直接复制粘贴运行的话没有图片的)
function setImageButtonSate() { 
if (PagerFields.currentPage <= 1) 
$("#HG_pagerPre").css("backgroundPosition", "-3px -3px"); //grey pre 
else 
$("#HG_pagerPre").css("backgroundPosition", "-3px -19px"); // black pre 
if (PagerFields.currentPage == PagerFields.pageCount) 
$("#HG_pagerNext").css("backgroundPosition", "-20px -3px"); //grey next 
else 
$("#HG_pagerNext").css("backgroundPosition", "-20px -19px"); // black next 
}

这个是构造插件的函数
ini: function (options) { 
_pagerFields = PagerFields; 
return this.each(function () { 
var $this = $(this); 
$this.text(""); 
$out_div = $("<div id='hg_pager_outter_div' style='margin-bottom:-10px'></div>"); 
$this.append($out_div); 
$out_div.append("<div><span id='HG_pagerPre' style='background-position:-3px -19px'></span></div>"); 
$out_div.append("<div style='float:left;'><input id='HG_pageNum' type='text' value='0' readonly='readonly'/></div>"); 
$out_div.append("<div><span id='HG_pagerNext' style='background-position:-20px -19px' ></span></div>"); 
$out_div.append("页  "); 
$out_div.append("共<span id='HG_pageCount'>0</span>页"); 
$out_div.append("  "); 
$out_div.append("每页<select id='HG_pagerSize'></select>个记录"); 
$out_div.append("  "); 
$out_div.append("共有 <span id='HG_recordCount'>0</span> 个记录"); 
$out_div.append("  "); 
$this.append("<br/>"); 
$this.find("#HG_pagerPre").css("backgroundPosition", "-3px -3px"); 
$this.find("#HG_pagerNext").css("backgroundPosition", "-20px -3px"); 
if (options.pageSizes) { 
for (var i = 0; i < options.pageSizes.length; i++) { 
$("#HG_pagerSize").append("<option>" + options.pageSizes[i] + "</option>"); 
} 
_pagerFields.pageSize = options.pageSizes[0]; 
} 
else { 
var default_page_size = [10, 30, 50]; 
for (var i = 0; i < default_page_size.length; i++) { 
$("#HG_pagerSize").append("<option>" + default_page_size[i] + "</option>"); 
} 
_pagerFields.pageSize = default_page_size[0]; 
} 
if (options.selRecord != undefined && !options.selRecord) { 
$("#selRecord_div").css("display", 'none'); 
} 
if (options.pagerFuncton) { 
_pagerFields.pagerFunction = options.pagerFuncton; 
} 
if (options.recordCount) { 
_pagerFields.recordCount = options.recordCount; 
$("#HG_recordCount").text(_pagerFields.recordCount); 
_pagerFields.pageCount = _pagerFields.recordCount % _pagerFields.pageSize == 0 ? _pagerFields.recordCount / _pagerFields.pageSize : Math.ceil(_pagerFields.recordCount / _pagerFields.pageSize); 
$("#HG_pageCount").text(_pagerFields.pageCount); 
_pagerFields.currentPage = 1; 
$("#HG_pageNum").val(_pagerFields.currentPage); 
setImageButtonSate(); 
_pagerFields.pagerFunction(_pagerFields.pageSize, _pagerFields.currentPage); 
} 
// setting element 
// bingding event 
$("#HG_pagerPre").click(function () { 
if (_pagerFields.currentPage <= 1) return; 
else _pagerFields.currentPage--; 
setImageButtonSate(); 
$("#HG_pageNum").val(_pagerFields.currentPage); 
_pagerFields.pagerFunction(_pagerFields.pageSize, _pagerFields.currentPage); 
}); 
$("#HG_pagerNext").click(function () { 
if (_pagerFields.currentPage == _pagerFields.pageCount) return; 
else _pagerFields.currentPage++; 
setImageButtonSate(); 
$("#HG_pageNum").val(_pagerFields.currentPage); 
_pagerFields.pagerFunction(_pagerFields.pageSize, _pagerFields.currentPage); 
}); 
$("#HG_pagerSize").change(function () { 
_pagerFields.pageSize = $this.find("option:selected").text() * 1; 
_pagerFields.pageCount = _pagerFields.recordCount % _pagerFields.pageSize == 0 ? _pagerFields.recordCount / _pagerFields.pageSize : Math.ceil(_pagerFields.recordCount / _pagerFields.pageSize); 
$("#HG_pageCount").text(_pagerFields.pageCount); 
_pagerFields.currentPage = 1; 
$("#HG_pageNum").val(1); 
setImageButtonSate(); 
_pagerFields.pagerFunction(_pagerFields.pageSize, _pagerFields.currentPage); 
}); 
}); 
}

下面是插件的公共函数
//获取当前的页码 
getCurrentPageIndex: function (options) { 
return _pagerFields.currentPage; 
}, 
//获取记录的总数 
getRecordCount: function (options) { 
return _pagerFields.recordCount; 
}, 
//获取当前页面数量 
getCurrentPageCount: function (options) { 
return _pagerFields.pageCount; 
}, 
//获取页面的大小 
getCurrentPageSize: function (options) { 
return _pagerFields.pageSize; 
}

使用示例
$(function () { 
$("#testPager").HGPager2({ 
pageSizes: [10, 20, 30], 
recordCount: 123, 
pagerFuncton: function (size, index) { 
alert("size: " + size + " index: " + index); 
} 
}); 
}); 
function test_Click() { 
alert( 
$("#testPager").HGPager2("getCurrentPageIndex")+" "+ 
$("#testPager").HGPager2("getRecordCount")+" "+ 
$("#testPager").HGPager2("getCurrentPageCount")+" "+ 
$("#testPager").HGPager2("getCurrentPageSize") 
); 
}

由于本人对js作用域的理解不够透彻,此个插件采用的模式也不知道是否最适合,上述内容如有说错的,请批评指正。
Javascript 相关文章推荐
javascript算法学习(直接插入排序)
Apr 12 Javascript
简单实例处理url特殊符号&amp;处理(2种方法)
Apr 02 Javascript
Jquery为a标签的href赋值实现代码
May 03 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
Jun 23 Javascript
JavaScript的内存释放问题详解
Jan 21 Javascript
JS 调试中常见的报错问题解决方法
May 20 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
Oct 24 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
Oct 31 Javascript
手把手教你使用TypeScript开发Node.js应用
May 06 Javascript
微信js-sdk 录音功能的示例代码
Nov 01 Javascript
微信小程序 scroll-view的使用案例代码详解
Jun 11 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
Dec 24 Javascript
javascript改变position值实现菜单滚动至顶部后固定
Jan 18 #Javascript
js+数组实现网页上显示时间/星期几的实用方法
Jan 18 #Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
Jan 18 #Javascript
js replace正则表达式应用案例讲解
Jan 17 #Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
Jan 17 #Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
Jan 17 #Javascript
Javascript模块化编程(一)模块的写法最佳实践
Jan 17 #Javascript
You might like
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
JS常见构造模式实例对比分析
2018/08/27 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
5款非常棒的Python工具
2018/01/05 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
宿舍打麻将检讨书
2014/01/24 职场文书
2015年项目工作总结
2015/04/29 职场文书
运动会通讯稿600字
2015/07/20 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书
总结Python使用过程中的bug
2021/06/18 Python
MySQL创建定时任务
2022/01/22 MySQL