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

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

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作用域的理解不够透彻,此个插件采用的模式也不知道是否最适合,上述内容如有说错的,请批评指正。 

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

时间: 2024-10-06 08:13:48

使用jQuery.fn自定义jQuery翻页插件的相关文章

jQuery为开发插件提拱了两个方法:jQuery.fn.extend(); jQuery.extend();

jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); jQuery.fn jQuery.fn = jQuery.prototype = { init: function( selector, context ) {//…. //…… }; 原来 jQuery.fn = jQuery.prototype.对prototype肯定不会陌生啦. 虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便. jQuery

jquery.Table实现的翻页功能比较完整漂亮,本想扩展个模版DIV

jquery.dataTable实现的翻页功能比较完整漂亮,本想提取其的翻页部分,再结合模版DIV,bootstrop实现聊天记息的展示. jquery.Table 与table结合的较紧,不能在很下提取完成. 看了近一天的源码后,对API的结构,实现方式和思路有了基本的认识,但终因工作量太大放弃了提取的念头,时间所迫转用KenDo的翻页 不过这过程中,对其的API实现有了较深的认识. 这里摘录部分资料 以下是在进行dataTable绑定处理时候可以附加的参数: 属性名称 取值范围 解释 bAu

jQuery插件开发及jQuery.extend函数详解和jQuery.fn与jQuery.prototype区别

一.jQuery插件开发分为两种:  1.类级别: 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.extend(object); $.extend({ add:function(a,b){return a+b;} , minus:function(a,b){return a-b;} }); var i = $.add(3,2); var j = $.minus(3,2); 2.对象级别: 对

移动端翻页插件dropload.js(支持Zepto和jQuery)

一. 声明 代码来源:github上的dropload项目. 二. 问题 dropload.js提供了最基本的上拉翻页,下拉刷新功能.对于由服务端一次返回所有数据的情况基本通用. 但是,需求往往不是服务端一次性返回所有数据,往往还要支持服务端分页,搜索,排序,多条件筛选等功能.(比较类似美团美食的界面) 三. 解决方案. 改进1:由于有分页,搜索,排序,多条件筛选功能,可能都不需要上拉,进到页面就没有数据. 例如:搜索一个服务端不存在的名字. 所以,添加接口设置setHasData. MyDro

jQuery炫酷3D翻页式电子时钟特效

FlipClock.js是一款实现翻页式效果的jQuery计时器插件.该计时器插件可以实现时分秒的计时,12小时制的计时,24小时制的计时,各种计数器效果,倒计数效果等等. 现在有各种版本的计时器和计数器插件,但是它们大部分都是只实现了某个特定方面的内容.而FlipClock充分适应了各种需求,既可以做计数器,也可以做计时器.以下是FlipClock的一些应用场景和它的一些特点: 作为时钟使用. 作为计时器使用. 作为倒计数器使用. FlipClock的样式使用纯CSS定制. 语法干净整洁. 所

jquery easyui datagrid 在翻页以后仍能记录被选中的行及刷新设置选中行数据

//easyUI的datagrid在复选框多选时,如何在翻页以后仍能记录被选中的行://注意datagrid中需要配置idField属性,一般为数据的主键 $.ajax({ type: 'GET', url:url, async:false, success: function (dt) { var grid = $('#list'); grid.datagrid('reload');//刷新表格数据 grid.datagrid({ onLoadSuccess:function(){ grid.

C# winfrom 中自定义的翻页控件(自己设计)

1.主要是使用控件绑定点击事件 用到的控件分别为picturebox   lable  上一页pbPage_Prev    下一页 pbPage_Next  首页 pbPage_Begin   尾页pbPage_End  是picturebox控件加背景图 "第  页/ 共  页" 是一个lable "labPageInfo"    在lable上面加了一个隐藏的textbox 控件 "txtPageInfo" 2.将这个翻页的功能单独写在用户控

用jQuery写的一个翻页,并封装为插件,

1 *{ 2 margin:0; 3 padding: 0; 4 list-style: none; 5 text-decoration: none; 6 } 7 .page{ 8 width:500px; 9 margin:100px auto; 10 color: #ccc; 11 } 12 .page a{ 13 display: inline-block; 14 color: #428bca; 15 height: 25px; 16 line-height: 25px; 17 paddi

JQuery+Bootstrap 自定义全屏Loading插件

1 /** 2 * 自定义Loading插件 3 * @param {Object} config 4 * { 5 * content[加载显示文本], 6 * time[自动关闭等待时间(ms)] 7 * } 8 * @param {String} config 9 * 加载显示文本 10 * @refer 依赖 JQuery-1.9.1及以上.Bootstrap-3.3.7及以上 11 * @return {KZ_Loading} 对象实例 12 */ 13 function KZ_Load