UDN-企业互联网技术人气社区

板块导航

浏览  : 638
回复  : 2

[原生js] 分页插件--根据Bootstrap Paginator改写的js插件

[复制链接]
白青青的头像 楼主
发表于 2017-1-3 15:22:25 | 显示全部楼层 |阅读模式
  刚刚出来实习,之前实习的公司有一个分页插件,和后端的数据字典约定好了的,基本上是看不到内部是怎么实现的,新公司是做WPF的,好像对于ASP.NET的东西不多,导师扔了一个小系统给我和另一个同事,指了两种框架的方案就让我们自己做了。。。

  刚开始在网上找了一下,觉得bootstrap-paginator的API暴露出来,修改一下就可以做成之前实习公司的那种了,但是觉得没有跳转,很奇怪,想要一个,就动手在github上把源码拿下来了,不得不说,这代码写得真是比我这些实习码农好太多。(之前实习公司的组长临走之前给了我几个意见,其中就有让我多上全球最大的男性交友社区github多去看看  - - )这里给一下地址吧。 bootstrap-paginator下载地址

  看了一些网上对于bootstrap-paginator插件的使用教程,对于使用起来还是没太大问题的,自己在改代码的时候发现都不太全。

  首先,插件有调节大小、调节浮动位置的功能,但是我用的是bootstrap3,在bootstrap3中这些特性都不支持。。

  后来,我就找了一下别的样式(前端无能,十分佩服前端大牛,硬是能把页面组织起来),效果大概就是:
给一下这个html代码吧。
  1. <div id="pager" class="ui-paging-container">
  2.   <ul>
  3.     <li class="ui-pager ui-pager-disabled" data-original-title="" title="">
  4.       <a><<</a>
  5.     </li>
  6.     <li class="ui-pager ui-pager-disabled" data-original-title="" title="">
  7.       <a><</a>
  8.     </li>
  9.     <li class="ui-pager focus" data-original-title="" title="">
  10.       <a>1</a>
  11.     </li>
  12.     <li class="ui-pager" data-original-title="" title="">
  13.       <a>2</a>
  14.     </li>
  15.     <li class="ui-pager" data-original-title="" title="">
  16.       <a>3</a>
  17.     </li>
  18.     <li class="ui-pager" data-original-title="" title="">
  19.       <a>4</a>
  20.     </li>
  21.     <li class="ui-pager" data-original-title="" title="">
  22.       <a>5</a>
  23.     </li>
  24.     <li class="ui-paging-ellipse" data-original-title="" title="">...</li>
  25.     <li class="ui-pager" data-original-title="" title="">
  26.       <a>10</a>
  27.     </li>
  28.     <li class="ui-pager" data-original-title="" title="">
  29.       <a>></a>
  30.     </li>
  31.     <li class="ui-pager" data-original-title="" title="">
  32.       <a>>></a>
  33.     </li>
  34.     <li class="ui-paging-toolbar" data-original-title="" title="">
  35.     <input class="ui-paging-count" type="text" id="txt_turn">
  36.       <a href="JavaScript:void(0)" id="btn_turn">跳转</a>
  37.     </li>
  38.   </ul>
  39. </div>
复制代码

  样式代码很简单,如果有人想用的话,可以修改一下我的样式代码。。真的好像不怎么好看。
  1. .ui-paging-container {color: #666; font-size: 15px;}
  2. .ui-paging-container ul {overflow: hidden; text-align: center;}
  3. .ui-paging-container ul, .ui-paging-container li {list-style: none;}
  4. .ui-paging-container li {display: inline-block;padding: 3px 6px;margin-left: 5px;color: #666;}
  5. .ui-paging-container li a {color: #666; text-decoration: none; }
  6. .ui-paging-container li.ui-pager {cursor: pointer;border: 1px solid #ddd;border-radius: 2px;}
  7. .ui-paging-container li.ui-pager:hover, .ui-paging-container li.focus { background-color: #288df0;color: #FFFFFF;}
  8. .ui-paging-container li.ui-paging-ellipse {border: none;}
  9. .ui-paging-container li.ui-paging-toolbar {padding: 0;}
  10. .ui-paging-container li.ui-paging-toolbar select {height: 25px;border: 1px solid #ddd;color: #666;}
  11. .ui-paging-container li.ui-paging-toolbar input {line-height: 20px;height: 23px;padding: 0;border: 1px solid #ddd;text-align: center;width: 33px;margin: 0 0 0 5px;vertical-align: middle;}
  12. .ui-paging-container li.ui-paging-toolbar a {vertical-align: middle; text-decoration: none;display: inline-block;height: 23px;border: 1px solid #ddd;vertical-align: top;border-radius: 2px;line-height: 20px;padding: 0 3px;cursor: pointer;margin-left: 5px;color: #666;}
  13. .ui-paging-container li.ui-pager-disabled, .ui-paging-container li.ui-pager-disabled:hover {background-color: #f6f6f6;cursor: not-allowed;border: none;color: #ddd;}
  14. .ui-paging-container li.ui-pager-disabled a { color: #ddd;text-decoration: none;}
复制代码

  看了样式的人应该发现了吧,原本是有一个选择框的,被我删了,选择框是用来控制页面显示信息的条数,因为这个控制目前不需要前端有,所以我取消了。

  好了,说说怎么调用吧。

属性
默认值
说明
containerClass
string,默认值为:''
为最外层div增加自定义样式
itemContainerClass
string|function,默认值为:null
为li标签增加自定义样式
itemContentClass
string|function,默认值为:null
为a标签添加自定义样式
currentPage
Number,默认值为:1
定义插件初始化后显示的页
ShowPagesNum
Number,默认值为:5
定义插件显示的按钮数量(不包括首页、末页、上一页、下一页等按钮)
totalPages
Number,默认值为:1
定义插件总页数
pageUrl
string|function,默认值为:null
为a标签加上href属性
onPageClicked
string|function,默认值为:null

函数四个参数:even、originalEvent、type、 page,type的值为:first|prev|next|last|

page|turn|ellipsis,page的值为单击按钮时跳转的页码,current是跳转前

的页码

onPageChanged
string|function,默认值为:null

函数四个参数:even、originalEvent、type、 page,type的值为:first|prev|next|last|

page|turn|ellipsis,page的值为单击按钮时跳转的页码,current是跳转前

的页码

useBootstrapTooltip
boolean,默认值为:false
是否使用bootstrap的提示框插件
shouldShowPage
function,默认值为:true

函数三个参数:type, page, current,type的值为:first|prev|next|last|

page|turn|ellipsis,page的值为单击按钮时跳转的页码,current是跳转前

的页码

itemTexts
function

可以修改页码的显示,如把type为first的文字改成'首页'

三个参数:type, page, current

tooltipTitles
function

修改页码元素的title属性,默认有一个简单的实现,

三个参数:type, page, current

bootstrapTooltipOptions
object

这个是把title注入到bootstrap的tooltip插件的模板


  大部分都还是保持和bootstrap-paginator插件的属性。

  下面怎么调用呢?给一个html的实例吧。

  首先把定义的样式拿进来,就是上面那个,存一个文件,引入(也可以和你自己的css文件放在一起,可以减少http请求次数)。
  1. <link href="~/Content/css/style.css" rel="stylesheet" />
复制代码

  这些都是基于jquery的插件,并且要1.8以上的版本。
  1. <script src="~/Scripts/jquery-1.10.2.js"></script>
复制代码

  接下来就是引用我们最重要的js文件了。
  1. <script src="~/Scripts/mypager.js"></script>
复制代码

  html中放一个div,这个div就是接下来要生成分页控件的父元素。记住一定是要div,bootstrap-paginator中bootstrap2是用div,bootstrap3是用ul。这里因为我们自己写的样式,就被我改成了必须是div。
  1. <div id="pager"></div>
复制代码

  写一个简单的调用脚本。
  1. var option = {
  2.   currentPage: 1,
  3.   totalPages: 10,
  4.   ShowPagesNum: 5
  5.   };
  6. $('#pager').myPager(option);
复制代码

  HTML里的调用就到这里了。我用的是ASP.NET MVC,所以直接用Razor引擎把ViewData或者ViewBag的数据装载进js里就好了。当然,既然打算这样用了,最好在后端直接写一个类,我给个例子。
  1. public class Pager
  2.     {
  3.         /// <summary>
  4.         /// 当前页码
  5.         /// </summary>
  6.         public int PageIndex { get; set; }

  7.         /// <summary>
  8.         /// 总页数
  9.         /// </summary>
  10.         public int TotalPages { get; set; }

  11.         /// <summary>
  12.         /// 每页展示信息数
  13.         /// </summary>
  14.         public int PageSize { get; set; }

  15.         /// <summary>
  16.         /// 前端分页调用的js方法名
  17.         /// </summary>
  18.         public string PagerFun { get; set; }

  19.         public Pager()
  20.         {

  21.         }

  22.         public Pager(string pager)
  23.         {
  24.             PagerFun = pager;
  25.         }
  26.     }
复制代码

  前面几个属性都好理解,那个PagerFun是什么呢?在插件的属性中,有几个函数,比如:pageUrl、onPageClicked等,后端如果想在不同分页里调用不同分页按钮点击事件,只需要把对应的js函数名在Razor引擎中放进插件声明时的参数就好了。这里给个例子吧。

  C# MVC控制器:
  1. public ActionResult Index()
  2. {
  3.     Pager pager = new Pager("test");
  4.     pager.PageIndex = 1;
  5.     pager.PageSize = 10;
  6.     pager.TotalPages = 10;
  7.     return View(pager);
  8. }
复制代码

  ps:这里使用了刚刚上面那个Pager类。

  CSHTML:
  1. @{
  2.     Layout = null;
  3.     var pager = Model as WebApplication4.Models.Pager;
  4. }

  5. <!DOCTYPE html>

  6. <html>
  7. <head>
  8.     <meta name="viewport" content="width=device-width" />
  9.     <link href="~/Content/css/style.css" rel="stylesheet" />
  10.     <script src="~/Scripts/jquery-1.10.2.js"></script>
  11.     <title>Index</title>
  12. </head>
  13. <body>
  14.     <div id="pager">
  15.     </div>
  16.     <script src="~/Scripts/mypager.js"></script>
  17.     <script>
  18.         var test = function (even,originalEvent,type, page) {
  19.             alert(page);
  20.         };
  21.         var option = {
  22.             currentPage: @pager.PageIndex,
  23.             totalPages: @pager.TotalPages,
  24.             ShowPagesNum: 5,
  25.             onPageClicked:@(pager.PagerFun)
  26.             };
  27.         $('#pager').myPager(option);
  28.     </script>
  29. </body>
  30. </html>
复制代码

  主要是onPageClicked:@(pager.PagerFun)这一句,在Razor引擎顶部我们声明了pager变量,从控制器中传到视图层,强转之后把PagerFun变量赋给了插件的onPageClicked属性,插件内部识别它是一个函数就调用了,例子中PagerFun的值为"test",效果是单击哪个按钮就弹出按钮代表的页码。
1.png

  这只是其中一个函数,onPageChanged等都是可以的。第一次写,自己的js功底也并不是很深,借着bootstrap-paginator作者的源码学习了很多,代码也写得很优美!

相关帖子

发表于 2017-1-3 15:22:55 | 显示全部楼层
回帖支持下楼主,请眼熟我,我叫“随缘补刀“
使用道具 举报

回复

发表于 2017-1-5 00:20:59 | 显示全部楼层
不错的帖子,支持下
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部