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 相关文章推荐
jQuery中bind与live的用法及区别小结
Jan 27 Javascript
浅谈window对象的scrollBy()方法
Jul 15 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
Jun 26 Javascript
React Native预设占位placeholder的使用
Sep 28 Javascript
写给小白看的JavaScript异步
Nov 29 Javascript
vue2.0实现前端星星评分功能组件实例代码
Feb 12 Javascript
基于jquery实现九宫格拼图小游戏
Nov 30 jQuery
vue webpack打包后图片路径错误的完美解决方法
Dec 07 Javascript
详解Vue组件之间通信的七种方式
Apr 14 Javascript
layui使用label标签的方法
Sep 14 Javascript
ES6中Set和Map用法实例详解
Mar 02 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
Jul 19 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
非常不错的MySQL优化的8条经验
2008/03/24 PHP
php实现jQuery扩展函数
2009/10/30 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
orm获取关联表里的属性值
2016/04/17 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
jquery map方法使用示例
2014/04/23 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
Python自动抢红包教程详解
2019/06/11 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
基于python 取余问题(%)详解
2020/06/03 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
海外淘书首选:AbeBooks
2017/07/31 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
医院护士的求职信范文
2013/12/26 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
亲情作文之母爱
2019/09/25 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python