某页码显示的helper 少量调整,另附js版


Posted in Javascript onSeptember 12, 2010

如果你只想下载现成的用,可以到这个页面上去找。
许可证是“WTFPL”,也就是“Do What The Fuck You Want To Public License”。

源代码如下(因为有注释,就不另外说明了):
public static class PageNumExt 
{ 
/// <summary> 
/// 使用传入的委托计算并产生友好的页码。 
/// </summary> 
/// <param name="o"></param> 
/// <param name="currentPage">当前页码</param> 
/// <param name="actionPageNum">处理页码的方式</param> 
/// <param name="actionFolding">处理被折叠页码的方式</param> 
/// <param name="maxSiblings">临近页码的数量</param> 
/// <param name="preventFolding">阻止折叠页码的临界值,超过这个数目的页码将会被折叠</param> 
public static void PageNumView(this object o, 
long currentPage, PageNumAction actionPageNum, Action actionFolding, 
long maxSiblings = 2, long preventFolding = 1) 
{ 
o.PageNumView(currentPage, actionPageNum, actionPageNum, actionFolding, maxSiblings, preventFolding); 
} 
/// <summary> 
/// 使用传入的委托计算并产生友好的页码。当前页码将会被特别对待。 
/// </summary> 
/// <param name="o"></param> 
/// <param name="currentPage">当前页码</param> 
/// <param name="actionCurrent">处理当前页码的方式</param> 
/// <param name="actionPageNum">处理页码的方式</param> 
/// <param name="actionFolding">处理被折叠页码的方式</param> 
/// <param name="maxSiblings">临近页码的数量</param> 
/// <param name="preventFolding">阻止折叠页码的临界值,超过这个数目的页码将会被折叠</param> 
public static void PageNumView(this object o, 
long currentPage, PageNumAction actionCurrent, 
PageNumAction actionPageNum, Action actionFolding, 
long maxSiblings = 2, long preventFolding = 1) 
{ 
o.PageNumView( 
currentPage, actionCurrent, 
1, long.MaxValue, 
actionPageNum, i => { }, 
maxSiblings, actionPageNum, 
preventFolding, actionFolding, 
maxSiblings, 0, 
actionPageNum, i => { } 
); 
} 
/// <summary> 
/// 根据传入的参数和委托来计算并产生友好的页码。当前页码将会被特别对待。 
/// </summary> 
/// <param name="o"></param> 
/// <param name="currentPage">当前页码</param> 
/// <param name="actionCurrent">处理当前页码的方式</param> 
/// <param name="beginPage">预设的起始页码</param> 
/// <param name="endPage">预设的结束页码</param> 
/// <param name="actionPageNum">处理页码的方式</param> 
/// <param name="actionFolding">处理被折叠页码的方式</param> 
/// <param name="maxSiblings">临近页码的数量</param> 
/// <param name="preventFolding">阻止折叠页码的临界值,超过这个数目的页码将会被折叠</param> 
public static void PageNumView(this object o, 
long currentPage, PageNumAction actionCurrent, 
long beginPage, long endPage, 
PageNumAction actionPageNum, Action actionFolding, 
long maxSiblings = 2, long preventFolding = 1) 
{ 
o.PageNumView(currentPage, actionCurrent, beginPage, endPage, actionPageNum, actionPageNum, actionPageNum, actionFolding, maxSiblings, preventFolding); 
} 
/// <summary> 
/// 根据传入的参数和委托来计算并产生友好的页码。当前页码、起始页码和终止页码都指定了专用的委托来处理。 
/// </summary> 
/// <param name="o"></param> 
/// <param name="currentPage">当前页码</param> 
/// <param name="actionCurrent">处理当前页码的方式</param> 
/// <param name="beginPage">预设的起始页码</param> 
/// <param name="endPage">预设的结束页码</param> 
/// <param name="actionBegin">处理起始页码的方式</param> 
/// <param name="actionEnd">处理结束页码的方式</param> 
/// <param name="actionSebling">处理临近页码的方式</param> 
/// <param name="actionFolding">处理被折叠页码的方式</param> 
/// <param name="maxSiblings">临近页码的数量</param> 
/// <param name="preventFolding">阻止折叠页码的临界值,超过这个数目的页码将会被折叠</param> 
public static void PageNumView(this object o, 
long currentPage, PageNumAction actionCurrent, 
long beginPage, long endPage, 
PageNumAction actionBegin, PageNumAction actionEnd, 
PageNumAction actionSebling, Action actionFolding, 
long maxSiblings = 2, long preventFolding = 1) 
{ 
o.PageNumView( 
currentPage, actionCurrent, 
beginPage, endPage, 
actionBegin, actionEnd, 
maxSiblings, actionSebling, 
preventFolding, actionFolding, 
maxSiblings, maxSiblings, 
actionSebling, actionSebling 
); 
} 
/// <summary> 
/// 根据传入的参数和委托来计算并产生友好的页码。每一种页码的具体处理方式都需要由调用方指派委托。 
/// </summary> 
/// <param name="o"></param> 
/// <param name="currentPage">当前页码</param> 
/// <param name="actionCurrent">处理当前页码的方式</param> 
/// <param name="beginPage">预设的起始页码</param> 
/// <param name="endPage">预设的结束页码</param> 
/// <param name="actionBegin">处理起始页码的方式</param> 
/// <param name="actionEnd">处理结束页码的方式</param> 
/// <param name="currentSiblings">当前页码的临近页码数量</param> 
/// <param name="actionCurrentSibling">处理临近页码的方式</param> 
/// <param name="preventFolding">阻止折叠页码的临界值,超过这个数目的页码将会被折叠</param> 
/// <param name="actionFolding">处理被折叠页码的方式</param> 
/// <param name="endOfBegin">起始页临近页码的数量</param> 
/// <param name="beginOfEnd">结束页临近页码的数量</param> 
/// <param name="actionBeginSibling">处理起始页临近页码的方式</param> 
/// <param name="actionEndSibling">处理结束页临近页码的方式</param> 
public static void PageNumView(this object o, 
long currentPage, PageNumAction actionCurrent, 
long beginPage, long endPage, 
PageNumAction actionBegin, PageNumAction actionEnd, 
long currentSiblings, PageNumAction actionCurrentSibling, 
long preventFolding, Action actionFolding, 
long endOfBegin, long beginOfEnd, 
PageNumAction actionBeginSibling, PageNumAction actionEndSibling 
) 
{ 
long i = beginPage; 
// 如果起始页小于当前页,就开始处理起始页 
if (beginPage < currentPage) 
#region 
{ 
actionBegin(beginPage); 
i++; 
endOfBegin += i; // 解决靠近起始页的页码之后 
var siblingBegin = currentPage - currentSiblings; // 当前页的临近页从何处开始 
var foldingStart = siblingBegin - preventFolding; // 页码折叠的底线 
if (endOfBegin > siblingBegin) 
endOfBegin = siblingBegin; // 保证当前页的临近页,牺牲起始页的临近页 
for (; i < endOfBegin; i++) 
actionBeginSibling(i); 
if (i < foldingStart) // 如果还没到达折叠底线,就马上开始折叠 
{ 
actionFolding(); 
i = foldingStart + 1; // 跳到折叠之后的页码 
} 
} 
#endregion 
// 处理当前页之前的临近页 
for (; i < currentPage; i++) 
actionCurrentSibling(i); 
// 处理当前页 
actionCurrent(currentPage); 
i = currentPage + 1; // 表示当前页已经处理完成。 
// 由于不能保证当前页和期望的起始页的关系,所以在此从当前页开始计算。 
var goal = i + currentSiblings; // 设定一个目标 
if (goal > endPage) // 目标不要超过结束页 
goal = endPage; 
// 处理当前页之后的临近页,直到到达目标页为止 
for (; i < goal; i++) 
actionCurrentSibling(i); 
// 如果结束页大于当前页,就开始处理结束页 
if (endPage > currentPage) 
#region 
{ 
beginOfEnd = endPage - beginOfEnd; // 计算出结束页的临近页从何处开始 
var foldingStart = beginOfEnd - preventFolding; 
if (i < foldingStart) // 没有触及折叠底线,马上开始折叠 
{ 
actionFolding(); 
i = beginOfEnd; 
} 
else // 全部当作当前页的临近页来处理,但保留结束页的临近页 
for (; i < beginOfEnd; i++) 
actionCurrentSibling(i); for (; i < endPage; i++) 
actionEndSibling(i); 
actionEnd(endPage); 
} 
#endregion 
} 
}

JavaScript版的源代码可以直接在前面提到的页面下载,不过这里也列出一下:
!function () { 
var g = this; 
var def_maxSiblings = 2; 
var def_preventFolding = 1; 
function pnView1( 
currentPage, actionPageNum, actionFolding, 
maxSiblings, preventFolding 
) { 
/// <summary> 
/// 使用传入的委托计算并产生友好的页码。 
/// </summary> 
/// <param name="o"></param> 
/// <param name="currentPage">当前页码</param> 
/// <param name="actionPageNum">处理页码的方式</param> 
/// <param name="actionFolding">处理被折叠页码的方式</param> 
/// <param name="maxSiblings">临近页码的数量</param> 
/// <param name="preventFolding">阻止折叠页码的临界值,超过这个数目的页码将会被折叠</param> 
pnView2(currentPage, actionPageNum, actionPageNum, actionFolding, maxSiblings || def_maxSiblings, preventFolding || def_preventFolding); 
} 
function pnView2( 
currentPage, actionCurrent, 
actionPageNum, actionFolding, 
maxSiblings, preventFolding 
) { 
/// <summary> 
/// 使用传入的委托计算并产生友好的页码。当前页码将会被特别对待。 
/// </summary> 
/// <param name="o"></param> 
/// <param name="currentPage">当前页码</param> 
/// <param name="actionCurrent">处理当前页码的方式</param> 
/// <param name="actionPageNum">处理页码的方式</param> 
/// <param name="actionFolding">处理被折叠页码的方式</param> 
/// <param name="maxSiblings">临近页码的数量</param> 
/// <param name="preventFolding">阻止折叠页码的临界值,超过这个数目的页码将会被折叠</param> 
pnView( 
currentPage, actionCurrent, 
1, Number.POSITIVE_INFINITY, 
actionPageNum, null, 
maxSiblings || def_maxSiblings, actionPageNum, 
preventFolding || def_preventFolding, actionFolding, 
maxSiblings || def_maxSiblings, 0, 
actionPageNum, null 
); 
} 
function pnView3( 
currentPage, actionCurrent, 
beginPage, endPage, 
actionPageNum, actionFolding, 
maxSiblings, preventFolding 
) { 
/// <summary> 
/// 根据传入的参数和委托来计算并产生友好的页码。当前页码将会被特别对待。 
/// </summary> 
/// <param name="o"></param> 
/// <param name="currentPage">当前页码</param> 
/// <param name="actionCurrent">处理当前页码的方式</param> 
/// <param name="beginPage">预设的起始页码</param> 
/// <param name="endPage">预设的结束页码</param> 
/// <param name="actionPageNum">处理页码的方式</param> 
/// <param name="actionFolding">处理被折叠页码的方式</param> 
/// <param name="maxSiblings">临近页码的数量</param> 
/// <param name="preventFolding">阻止折叠页码的临界值,超过这个数目的页码将会被折叠</param> 
pnView4(currentPage, actionCurrent, beginPage, endPage, actionPageNum, actionPageNum, actionPageNum, actionFolding, maxSiblings || def_maxSiblings, preventFolding || def_preventFolding); 
} 
function pnView4( 
currentPage, actionCurrent, 
beginPage, endPage, 
actionBegin, actionEnd, 
actionSebling, actionFolding, 
maxSiblings, preventFolding 
) { 
/// <summary> 
/// 根据传入的参数和委托来计算并产生友好的页码。当前页码、起始页码和终止页码都指定了专用的委托来处理。 
/// </summary> 
/// <param name="o"></param> 
/// <param name="currentPage">当前页码</param> 
/// <param name="actionCurrent">处理当前页码的方式</param> 
/// <param name="beginPage">预设的起始页码</param> 
/// <param name="endPage">预设的结束页码</param> 
/// <param name="actionBegin">处理起始页码的方式</param> 
/// <param name="actionEnd">处理结束页码的方式</param> 
/// <param name="actionSebling">处理临近页码的方式</param> 
/// <param name="actionFolding">处理被折叠页码的方式</param> 
/// <param name="maxSiblings">临近页码的数量</param> 
/// <param name="preventFolding">阻止折叠页码的临界值,超过这个数目的页码将会被折叠</param> 
pnView( 
currentPage, actionCurrent, 
beginPage, endPage, 
actionBegin, actionEnd, 
maxSiblings || def_maxSiblings, actionSebling, 
preventFolding || def_preventFolding, actionFolding, 
maxSiblings || def_maxSiblings, maxSiblings || def_maxSiblings, 
actionSebling, actionSebling 
); 
} 
function pnView( 
currentPage, actionCurrent, 
beginPage, endPage, 
actionBegin, actionEnd, 
currentSiblings, actionCurrentSibling, 
preventFolding, actionFolding, 
endOfBegin, beginOfEnd, 
actionBeginSibling, actionEndSibling 
) { 
/// <summary> 
/// 根据传入的参数和委托来计算并产生友好的页码。每一种页码的具体处理方式都需要由调用方指派委托。 
/// </summary> 
/// <param name="o"></param> 
/// <param name="currentPage">当前页码</param> 
/// <param name="actionCurrent">处理当前页码的方式</param> 
/// <param name="beginPage">预设的起始页码</param> 
/// <param name="endPage">预设的结束页码</param> 
/// <param name="actionBegin">处理起始页码的方式</param> 
/// <param name="actionEnd">处理结束页码的方式</param> 
/// <param name="currentSiblings">当前页码的临近页码数量</param> 
/// <param name="actionCurrentSibling">处理临近页码的方式</param> 
/// <param name="preventFolding">阻止折叠页码的临界值,超过这个数目的页码将会被折叠</param> 
/// <param name="actionFolding">处理被折叠页码的方式</param> 
/// <param name="endOfBegin">起始页临近页码的数量</param> 
/// <param name="beginOfEnd">结束页临近页码的数量</param> 
/// <param name="actionBeginSibling">处理起始页临近页码的方式</param> 
/// <param name="actionEndSibling">处理结束页临近页码的方式</param> 
var i = beginPage; 
// 如果起始页小于当前页,就开始处理起始页 
if (beginPage < currentPage) { 
actionBegin && actionBegin(beginPage); 
i++; 
endOfBegin += i; // 解决靠近起始页的页码之后 
var siblingBegin = currentPage - currentSiblings; // 当前页的临近页从何处开始 
var foldingStart = siblingBegin - preventFolding; // 页码折叠的底线 
if (endOfBegin > siblingBegin) 
endOfBegin = siblingBegin; // 保证当前页的临近页,牺牲起始页的临近页 
for (; i < endOfBegin; i++) 
actionBeginSibling && actionBeginSibling(i); 
if (i < foldingStart) // 如果还没到达折叠底线,就马上开始折叠 
{ 
actionFolding && actionFolding(); 
i = foldingStart + 1; // 跳到折叠之后的页码 
} 
} 
// 处理当前页之前的临近页 
for (; i < currentPage; i++) 
actionCurrentSibling && actionCurrentSibling(i); 
// 处理当前页 
actionCurrent && actionCurrent(currentPage); 
i = currentPage + 1; // 表示当前页已经处理完成。 
// 由于不能保证当前页和期望的起始页的关系,所以在此从当前页开始计算。 
var goal = i + currentSiblings; // 设定一个目标 
if (goal > endPage) // 目标不要超过结束页 
goal = endPage; 
// 处理当前页之后的临近页,直到到达目标页为止 
for (; i < goal; i++) 
actionCurrentSibling && actionCurrentSibling(i); 
// 如果结束页大于当前页,就开始处理结束页 
if (endPage > currentPage) { 
beginOfEnd = endPage - beginOfEnd; // 计算出结束页的临近页从何处开始 
var foldingStart = beginOfEnd - preventFolding; 
if (i < foldingStart) // 没有触及折叠底线,马上开始折叠 
{ 
actionFolding && actionFolding(); 
i = beginOfEnd; 
} 
else // 全部当作当前页的临近页来处理,但保留结束页的临近页 
{ 
for (; i < beginOfEnd; i++) 
actionCurrentSibling && actionCurrentSibling(i); 
} for (; i < endPage; i++) 
actionEndSibling && actionEndSibling(i); 
actionEnd && actionEnd(endPage); 
} 
} 
g.pnView1 = pnView1; 
g.pnView2 = pnView2; 
g.pnView3 = pnView3; 
g.pnView4 = pnView4; 
g.pnView5 = pnView; 
g.pnView = pnView; 
} ();

/201009/yuanma/pnView_NanaView.rar
Javascript 相关文章推荐
JS字符串截取函数实例
Dec 27 Javascript
javascript实现textarea中tab键的缩排处理方法
Jun 26 Javascript
JS表单验证的代码(常用)
Apr 08 Javascript
JS实现获取剪贴板内容的方法
Jun 21 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
Jun 25 Javascript
Bootstrap table两种分页示例
Dec 23 Javascript
div中文字内容溢出常见的解决方法
Mar 16 Javascript
Vue2.0设置全局样式(less/sass和css)
Nov 18 Javascript
axios拦截设置和错误处理方法
Mar 05 Javascript
layui按条件隐藏表格列的实例
Sep 19 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
Apr 03 Javascript
vue 实现把路由单独分离出来
Aug 13 Javascript
网页中CDATA标记的说明
Sep 12 #Javascript
JavaScript小技巧 2.5 则
Sep 12 #Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
Sep 12 #Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
Sep 12 #Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
Sep 12 #Javascript
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
Sep 12 #Javascript
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 #Javascript
You might like
php无限极分类实现的两种解决方法
2013/04/28 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
提高网站信任度的技巧
2008/10/17 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
jquery判断复选框选中状态以及区分attr和prop
2015/12/18 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
JavaScript类的写法
2016/09/17 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
vue实现文字加密功能
2019/09/27 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
用Python实现随机森林算法的示例
2017/08/24 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
通信工程专业毕业生推荐信
2013/12/25 职场文书
高中生家长会演讲稿
2014/01/14 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
承诺函格式模板
2015/01/21 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
出国留学导师推荐信
2015/03/26 职场文书
法定代表人身份证明书
2015/06/18 职场文书
幼儿园春季开学通知
2015/07/16 职场文书