jquery分页插件AmSetPager(自写)


Posted in Javascript onApril 15, 2013

第一次做的插件,早写好了,后来发现一个jquery插件模板,就拿过来套。名字叫jquery.boilerplate.js。我的理解不是很深,也不太理解太多效率问题。

本来我是一个做asp.net开发的,可是公司好些个人包括美工没太会js啊。项目很多js改来改去搞得我都头大了。萌发了写插件的想法,于是照葫芦画瓢写啊,写插件的过程也学了js的面向对象。对js,还有一些效率问题有了更深了解。以前有个项目单个页面写过600多行的js文件。全是按功能面向过程写的。乱的不堪回首啊好吧先是说一下插件吧。

插件叫AmSetPager,首先是看一下样子:

jquery分页插件AmSetPager(自写)

此处下载:点击下载
我这个插件好像使用有些另类,是调用数据展示容器的元素$("#DataContent").AmSetPager({...});在参数中配置分页容器元素ID。写完插件后看别的插件都是调用分页元素ID

贴下源码:

(function ( $, window, document, undefined ) { 
// Create the defaults once 
var pluginName = "AmSetPager", 
defaults = { 
pagerName: "pager", //分页的容器 
viewCount: 5, //可显示多少条数据 
dataCount: 0, //如果后台取数据,总数多少(静态的不用) 
selectClass: "selectno", //选中的样式 listCount:10, //显示多少个分页码(不包括前一页,后一页)<SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">,mode=default时该值需设置为5以上</SPAN> 
enablePrevNext:true, //允许显示前一页后一页 
enableFirst:true, //允许只有一页的情况下显示页码 
template:"default", //模板(现只有default) 
mode:"static", //"url" or "ajax" 
urlparameter:"", //url参数,后面aa=1&bb=2... 
callback:null //回调函数(ajax取数据或者静态也可以使用) 
}; 
// The actual plugin constructor 
function Plugin( element, options ) { 
this.element = element; 
this.options = $.extend( {}, defaults, options ); 
//this._defaults = defaults; 
this._name = pluginName; 
this.init(); 
} 
//private 
//获取url参数 
var getQueryString = function (name) { 
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 
var r = window.location.search.substr(1).match(reg); 
if (r != null) return unescape(r[2]); return undefined; 
} 
//静态模板数据展示 
var Bind_StaticData = function($content,minnum,maxnum) { 
if (minnum > 0) { 
$content.children(":gt(" + (minnum - 1) + "):lt(" + maxnum + ")").css("display", "block"); 
} else { 
$content.children(":lt(" + maxnum + ")").css("display", "block"); 
} 
$content.children(":lt(" + (minnum) + ")").css("display", "none"); 
$content.children(":gt(" + (maxnum - 1) + ")").css("display", "none"); 
} 
//主要 
//创建SetPager类 
var SetPager = function (options,pageCount){ 
this.op = options; 
this.pageCount = pageCount; 
} 
SetPager.prototype = { 
//格式化成a元素 
FormatStr : function(pageNo, pageText) { 
var href = this.op.mode=='url'?location.pathname+"?"+this.op.urlparameter+"&p="+pageNo:"javascript:void(0);"; 
if (typeof (pageText) == "number") { 
return "<a href='"+href+"' >" + pageText + "</a>"; 
} 
return "<a href='"+href+"' i='" + pageNo + "'>" + pageText + "</a>"; 
}, 
//选中状态a元素 
FormatStrIndex : function(pageNo){ 
return "<span class='"+this.op.selectClass+"'>" + pageNo + "</span>"; 
}, 
//默认模板初始化页码集合 
InitDefaultList : function(_pageIndex){ 
if(this.op.listCount<5) 
throw new Error("listCount must be lager than 5"); //listCount>5 
var pageIndex = parseFloat(_pageIndex); //转化为number 
var ns = new Array(); 
var numList = new Array(this.op.listCount); 
if (pageIndex >= this.op.listCount) { 
numList[0] = 1; 
numList[1] = "…"; 
var infront = 0; 
var inback = 0; 
var inflag = Math.floor((this.op.listCount-2)/2); 
if(this.op.listCount%2==0){ 
infront = inflag-1; 
inback = inflag; 
}else{ 
infront = inflag; 
inback = inflag; 
} 
if (pageIndex + inback >= this.pageCount) { 
for (i = this.pageCount - (this.op.listCount-3); i < this.pageCount + 1; i++) { 
ns.push(i); 
} 
for (j = 0; j <= (this.op.listCount-3); j++) { 
numList[j + 2] = ns[j]; 
} 
} 
for (i = pageIndex - infront; i <= pageIndex + inback; i++) { 
ns.push(i); 
} 
for (j = 0; j < (this.op.listCount-2); j++) { 
numList[j + 2] = ns[j]; 
} 
} else { 
if (this.pageCount >= this.op.listCount) { 
for (i = 0; i < this.op.listCount; i++) { 
numList[i] = i+1; 
} 
} else { 
for (i = 0; i < this.pageCount; i++) { 
numList[i] = i+1; 
} 
} 
} 
return numList; 
}, 
//生成页码 
InitPager : function(pageIndex){ 
$("#"+this.op.pagerName).html(''); 
if(this.op.enableFirst==false&&this.pageCount<=1){ 
return null; 
} 
var array = new Array(); 
//var finalarr = new Array(); 
var $con = $("#"+this.op.pagerName); 
switch(this.op.template){ //选择模板 
case 'default':array = this.InitDefaultList(pageIndex,this.pageCount);break; 
default:array = this.InitDefaultList(pageIndex,this.pageCount); 
} 
if(!array instanceof Array){ 
throw new Error("is not array"); 
} 
if(array.length!=this.op.listCount){ 
throw new Error("array.length error:"+array.length); 
} 
if(pageIndex>1&&this.op.enablePrevNext){ 
$con.append(this.FormatStr(pageIndex-1,'上一页')); 
} 
for(var i=0;i<array.length;i++){ 
if(typeof array[i]=='undefined'){ 
continue; 
} 
if(pageIndex==array[i]){ 
$con.append(this.FormatStrIndex(array[i])); 
}else if(typeof array[i]=='number'){ 
$con.append(this.FormatStr(array[i],array[i])); 
}else{ 
$con.append(array[i]); 
} 
} 
if(pageIndex<this.pageCount&&this.op.enablePrevNext){ 
$con.append(this.FormatStr(pageIndex+1,'下一页')); 
} 
//$("#"+this.op.pagerName).append(finalarr); 
} 
} 
Plugin.prototype = { 
//初始化 
init: function() { 
var options = this.options; 
var $thisbase = $(this.element); 
var $content; 
if($thisbase.is(':has(tbody)')){ 
$content=$thisbase.children(); 
} 
else{ 
$content=$thisbase; 
} 
var count = options.mode=='static'?$content.children().length:options.dataCount; 
var eachcount = options.viewCount; 
var totalpage = Math.ceil(count / eachcount); 
var $pager = $("#"+options.pagerName); 
var setpager = new SetPager(options,totalpage); //init 
if(options.mode=='url'){ 
var urlindex = getQueryString("p"); 
if(isNaN(urlindex)){ 
setpager.InitPager(1); 
}else{ 
setpager.InitPager(urlindex>totalpage?totalpage:urlindex); 
} 
}else{ 
setpager.InitPager(1); 
if(options.mode=='static'&&typeof options.callback!='function'){ 
Bind_StaticData($content,0,eachcount); 
}else{ 
options.callback($content,1,options.viewCount); 
} 
$pager.bind("click",function(e){ //click事件 
if(e.target.tagName!='A') return; 
var $this = $(e.target); 
$this.removeAttr("href").siblings().attr("href", "javascript:void(0);");//.. 
var indexnum = parseInt($this.html())==$this.html()?parseInt($this.html()):parseInt($this.attr('i')); 
var maxnum = (indexnum * eachcount); 
var minnum = (indexnum - 1) * eachcount; 
if(options.mode!='static'&&options.mode!='ajax'){ 
throw new Error("mode must be selected:static,url,ajax"); 
} 
if(options.mode=='static'&&typeof options.callback!='function'){ 
setpager.InitPager(indexnum); 
Bind_StaticData($content,minnum, maxnum); 
}else{ 
setpager.InitPager(indexnum); 
options.callback($content,indexnum,options.viewCount); 
} 
}); 
} 
} 
}; 

$.fn[pluginName] = function ( options ) { 
return this.each(function () { 
if (!$.data(this, "plugin_" + pluginName)) { 
$.data(this, "plugin_" + pluginName, new Plugin( this, options )); 
} 
}); 
}; 
})( jQuery, window, document );

说一下样式(.pager就是分页元素class):
<SPAN style="FONT-SIZE: 12px"><style type="text/css"> 
.pager a{ text-decoration: none; border: 1px solid #e7ecf0;color: #15B;} 
.pager a:hover{ background-color:#E6EBEF} 
.pager a,.pager span{display: inline-block;padding: 0.1em 0.4em;margin-right: 5px; margin-bottom: 5px;} 
.selectno{background: #26B;color: #fff;border: 1px solid #AAE;} 
</style></SPAN>

有三种方式,一个是页面中数据容器有全部数据,这时就是mode:'static'。还有就是ajax按分页方式取数据时,mode:'ajax',还有根据url传参分页mode:'url'(我感觉这时估计不会用到吧)。

首先静态的:

html:

<table id="tablepager" border="0" cellpadding="0" cellspacing="0"> 
<tr><td><p>1aaaaaaaaaaaaaaaaaaaaaa</p></td></tr> 
<tr><td><p>2aaaaaaaaaaaaaaaaaaaaaa</p></td></tr> 
<tr><td><p>3aaaaaaaaaaaaaaaaaaaaaa</p></td></tr> 
<tr><td><p>4aaaaaaaaaaaaaaaaaaaaaa</p></td></tr> 
<tr><td><p>5aaaaaaaaaaaaaaaaaaaaaa</p></td></tr> 
<tr><td><p>6aaaaaaaaaaaaaaaaaaaaaa</p></td></tr> 
<tr><td><p>7aaaaaaaaaaaaaaaaaaaaaa</p></td></tr> 
<tr><td><p>8aaaaaaaaaaaaaaaaaaaaaa</p></td></tr> 
<tr><td><p>9aaaaaaaaaaaaaaaaaaaaaa</p></td></tr> 
</table> 
<div id="pager" class="pager"></div>

js代码:
$(function(){ 
$("#tablepager").AmSetPager({"viewCount":2,"mode":"static","listCount":6}); 
})

这里也可以设置callback,和下面类似截图:

jquery分页插件AmSetPager(自写)
ajax的:

html:

<table id="tablepager" border="0" cellpadding="0" cellspacing="0"> 
</table> 
<div id="pager" class="pager"></div>

后台获取实例数据:
public void ProcessRequest(HttpContext context) 
{ 
context.Response.ContentType = "text/plain"; 
int index = int.Parse(context.Request.QueryString["index"]); 
int viewCount = int.Parse(context.Request.QueryString["viewCount"]); 
List<string> list = new List<string>(); 
for (int i = 1; i <= viewCount; i++) 
{ 
list.Add(index + "_" + i + "...................."); 
} 
JavaScriptSerializer ser = new JavaScriptSerializer(); 
context.Response.Write(ser.Serialize(list)); 
context.Response.End(); 
}

js代码:
<script type="text/javascript"> 
$(function () { 
$("#tablepager").AmSetPager({ "viewCount": 3, "mode": "ajax", "dataCount": 30, "listCount": 6, "callback": function (ev, indexnum, viewCount) {//callback中三个参数分别为:数据容器对象,当前页,显示几条数据 $.getJSON("Handler1.ashx", { "index": indexnum, "viewCount": viewCount }, function (data) { 
ev.html(''); 
for (var i = 0; i < data.length; i++) { 
ev.append("<tr><td>" + data[i] + "</td></tr>"); 
} 
}); 
} 
}); 
}) 
</script>

截图:

jquery分页插件AmSetPager(自写)

url的:
没什么可说的,js代码:

$(function(){ 
$("#tablepager").AmPager({"viewCount":5,"dataCount":50,"mode":"url","listCount":6,"urlparameter":"ss=1&ee=2"}); 
})

urlparameter为传的参数,也必须设置每页显示,和数据总条数。点击页码3,url地址栏为 :test.htm?ss=1&ee=2&p=3
插件写的可能有点臃肿,很多地方也不合理。希望大家下载试试,提提意见,让一个菜鸟能成长,谢啦
Javascript 相关文章推荐
javascript下给元素添加事件的方法与代码
Aug 13 Javascript
Prototype中dom对象方法汇总
Sep 17 Javascript
类似php的js数组的in_array函数自定义方法
Dec 27 Javascript
ie7+背景透明文字不透明超级简单的实现方法
Jan 17 Javascript
跟我学习javascript的隐式强制转换
Nov 16 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
Dec 02 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
原生js实现秒表计时器功能
Feb 16 Javascript
微信小程序实现tab切换效果
Nov 21 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
Apr 14 Javascript
微信小程序实现一张或多张图片上传(云开发)
Sep 25 Javascript
koa-passport实现本地验证的方法示例
Feb 20 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
Apr 15 #Javascript
关于jQuery object and DOM element
Apr 15 #Javascript
在jQuery中 关于json空对象筛选替换
Apr 15 #Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
Apr 15 #Javascript
关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
Apr 15 #Javascript
深入了解javascript中的prototype与继承
Apr 14 #Javascript
谈谈JavaScript中的函数与闭包
Apr 14 #Javascript
You might like
用php+mysql一个名片库程序
2006/10/09 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
微信小程序开发探究
2016/12/27 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
Vue-cli3项目配置Vue.config.js实战记录
2018/07/29 Javascript
小程序实现搜索框
2020/06/19 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
python实现井字棋游戏
2020/03/30 Python
Python 转义字符详细介绍
2017/03/21 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
Django 连接sql server数据库的方法
2018/06/30 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
详解Python中的Lock和Rlock
2021/01/26 Python
Delphi笔试题
2016/11/14 面试题
餐厅销售主管职责范本
2014/02/19 职场文书
导游个人求职信
2014/04/25 职场文书
外贸业务员求职信
2014/06/16 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
pycharm2021激活码使用教程(永久激活亲测可用)
2021/03/30 Python
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL