好久没有来逛园子,也好久没有更新博客,就像沉睡已久的人忽然被叫醒,忽然就被园友的回复惊醒了。园友提出了关于我之前一篇文章的疑问——可那已经是半年以前的博客了,加上我一直觉得分享给大家的应该是我最新的思路,于是促使我写下此文,希望对遇到同样问题的小伙伴们有帮助。

进入正题。

看过上一篇文章的童鞋们应该都清楚,之前的做法是通过输入不同的标签来生成dom,最终展示数据供用户查看的,可在后面的工作中,我越来越多的感到这种方式在某些需求场景中的力不从心(尤其在你尝试用不同方式展示数据时),所以改变了思路,从模板生成变为自定义生成。

先来看下代码是怎么写的:

  1. ///分页工具生成
  2. //dataEle-数据盒子
  3. //pageEle-分页盒子
  4. //obj-调用方法传递
  5. //url-传递方法内参
  6. //cndt-传递方法内参
  7. //ishow-传递方法内惨
  8. pagerTool: function (dataEle, pageEle, obj, url, cndt, ishow) {
  9. var total = $(pageEle).attr('total') - 0;//总数
  10. var rowcount = $(pageEle).attr('rowcount') - 0;//页尺寸
  11. var index = $(pageEle).attr('index') - 0;//页码
  12. var count = total % rowcount == 0 ? total / rowcount : Math.floor(total / rowcount) + 1;//总页数
  13. var Html = '';
  14. Html += '<p class="page">';
  15. Html += '<a href="javaScript:void(0)" class="prePage">上一页</a>';
  16. //总量大于15页时,生成转跳选择框并隐藏多余页码按钮
  17. if (count > 15) {
  18. //优化视觉效果
  19. if (index <= 8) {
  20. for (var i = 1; i <= 15; i++) {
  21. if (index != i) {
  22. Html += '<a href="javaScript:void(0)" class="nowPage">' + i + '</a>';
  23. } else {
  24. Html += '<a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">' + i + '</a>';
  25. }
  26. }
  27. } else {
  28. var s = index - 8 + 1;
  29. if (s + 14 > count) {
  30. var c = s + 14 - count;
  31. s = s - c;
  32. }
  33. for (var i = s ; i <= s + 14; i++) {
  34. if (index != i) {
  35. Html += '<a href="javaScript:void(0)" class="nowPage">' + i + '</a>';
  36. } else {
  37. Html += '<a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">' + i + '</a>';
  38. }
  39. }
  40. }
  41. Html += '<a href="javaScript:void(0)">转到</a>';
  42. Html += '<select class="nowPage">';
  43. for (var i = 1; i <= count; i++) {
  44. Html += '<option>' + i + '</option>';
  45. }
  46. Html += '</select>';
  47. Html += '<a href="javaScript:void(0)">页</a>';
  48. } else {
  49. for (var i = 1; i <= count; i++) {
  50. if (index != i) {
  51. Html += '<a href="javaScript:void(0)" class="nowPage">' + i + '</a>';
  52. } else {
  53. Html += '<a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">' + i + '</a>';
  54. }
  55. }
  56. }
  57. Html += '<a href="javaScript:void(0)" class="nextPage">下一页</a>';
  58. Html += '共有' + total + '条数据';
  59. Html += '</p>';
  60. $(pageEle).html(Html);
  61. $(pageEle).find('select').val(index);
  62. //上一页
  63. $(pageEle).find('a[class=prePage]').bind('click', function () {
  64. var index = $(this).parent().parent().attr('index') - 0;
  65. if (index > 1) {
  66. $(this).parent().parent().attr('index', index - 1);
  67. cndt.index = cndt.index - 1;
  68. obj(url, cndt, dataEle, pageEle, ishow);
  69. } else {
  70. alert('还想去哪儿啊,这是第一页~');
  71. }
  72. });
  73. //下一页
  74. $(pageEle).find('a[class=nextPage]').bind('click', function () {
  75. var index = $(this).parent().parent().attr('index') - 0;
  76. if (index < count) {
  77. $(this).parent().parent().attr('index', index + 1);
  78. cndt.index = (cndt.index - 0) + 1;
  79. obj(url, cndt, dataEle, pageEle, ishow);
  80. } else {
  81. alert('别翻了,后面没有了~');
  82. }
  83. });
  84. //当前页
  85. $(pageEle).find('a[class=nowPage]').bind('click', function () {
  86. var index = $(this).parent().parent().attr('index') - 0;
  87. $(this).parent().parent().attr('index', $(this).text());
  88. cndt.index = $(this).text();
  89. obj(url, cndt, dataEle, pageEle, ishow);
  90. });
  91. //指定页转跳
  92. $(pageEle).find('select[class=nowPage]').bind('change', function () {
  93. console.log(11111111111);
  94. var index = $(this).parent().parent().attr('index') - 0;
  95. $(this).parent().parent().attr('index', $(this).val());
  96. cndt.index = $(this).val();
  97. obj(url, cndt, dataEle, pageEle, ishow);
  98. });
  99. }

这个方法是分页工具的生成,正常生成后大概是这样:

直接调用上面的函数是无效的,实际上你仅需要调用这个函数:

  1. ///获取分页数据
  2. //url-接口地址
  3. //cndt-参数集合
  4. //ele-数据盒子
  5. //page-分页盒子
  6. //ishow-自定义显示方式
  7. getPage: function (url, cndt, ele, page, ishow) {
  8. Tool.myAjax(url, cndt, 'post', function (data) {
  9. var Html = ishow(data.rows);
  10. $(ele).html(Html);
  11. $(page).attr('index', cndt.index).attr('rowcount', cndt.size).attr('total', data.all_count);
  12. Tool.pagerTool($(ele), $(page), Tool.getPage, url, cndt, ishow);
  13. $(ele).parent().parent().animate({ scrollTop: 0 }, 300);
  14. });
  15. }

接下来就是外部调用时的写法:

  1. var data = { 'index': 1, 'size': 10 };
  2. Tool.getPage(你的接口地址, data, 用来存放数据的dom, 用来存放分页的dom, function (json) {
  3. var html = '';
  4. for (var i = 0; i < json.length; i++) {
  5. html += '<tr>';
  6. html += '<td>' + json[i].a+ '</td>';
  7. html += '<td>' + json[i].b + '</td>';
  8. html += '<td>' + json[i].c+ '</td>';
  9. html += '</tr>';
  10. }
  11. return html;
  12. });

如上,在 for 内部你可以自定义如何填充dom,data也是自定义的(不过 index 和 size 是必选项),最后的 return 别删掉了,它是传参给内部方法的最后一步。

最后需要注意的是,任何前端分页都需要后端支持,如果使用本工具,后端需要返回如下图格式的 json 数据:

其中,count(本次返回数据的条数)、all_count(符合条件的数据总计)、rows(内容,数组方式)为必选项。数组内存什么当然没有限制,并且童鞋们也可以在任何时候更改这些参数的名称,只要格式匹配上就好啦。

PS:文中两个基本函数用对象字面量方式封装,这一点与之前无异。如果有童鞋不明白对象字面量的,就去在园子里逛一逛吧~

自写JS分页工具【基于JQ】的更多相关文章

  1. 是时候升级你的Js工具了-分页【基于JQ】

    好久没有来逛园子,也好久没有更新博客,就像沉睡已久的人忽然被叫醒,忽然就被园友的回复惊醒了.园友提出了关于我之前一篇文章的疑问——可那已经是半年以前的博客了,加上我一直觉得分享给大家的应该是我最新的思 ...

  2. 分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解

    [博客园cnblogs笔者m-yb原创, 转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708]http ...

  3. Js处理数据——前端分页工具

    这几天有小伙伴讨论起了分页的相关问题,这里我也简单讲下前端如何简单便捷的利用Js(库)写出优雅,好用的分页工具. 分页是个很简单又超多接触的技术点,粗略来讲分如下两种: 真分页--每次根据页码.页大小 ...

  4. 一款基于Bootstrap的js分页插件bootstrap-paginator使用实例

    Bootstrap Paginator是一款基于Bootstrap的js分页插件,功能很丰富.它提供了一系列的参数用来支持用户的定制,提供了公共的方法可随时获得插件状态的改变,以及事件来监听用户的动作 ...

  5. 用vue.js的v-for,v-if,computed写一个分页样式

    在学Vue,总想写个分页,先写了一个样式. 主要看思路: 思路简单,得到总页数,判断总页数,循环. 先判断总页数是否需要分页,总页数==1页就不分了. 再判断总页数<11就不用--. 总页数&g ...

  6. 2015年最佳的15个 Node.js 开发工具

    Node.js 越来月流行,这个基于 Google V8 引擎建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.在本文中,我们列出了2015年最佳的15个 Node.js 开发工具.这些工具 ...

  7. 基于jq图片居中插件 [center]

    最近在做一个项目,大量的图片基于js进行缩放(图片放大镜),考虑用css要写许多hack,而已经基于jq了,干脆写个方法得了. 代码很简单,不用多讲但是很实用. $.fn.extend({ cente ...

  8. 基于JQ的简单左右轮播图

    // 轮播图 主要实现思想: a.第一层div,设置overflow为hidden. b.里面是一个ul,每个li里面有个img或者为每个li设置背景图片也可以. c.li设置为左浮动,排成一行,还有 ...

  9. [转]jquery.pagination.js分页

    本文转自:http://www.cnblogs.com/knowledgesea/archive/2013/01/03/2841554.html 序言 这一款js分页使用起来很爽,自己经常用,做项目时 ...

随机推荐

  1. 软考 程序员 下午考题 c语言 笔记

    1. 数组名 是表示数组空间首地址的指针常量,程序中不允许对常量赋值. 如 int  a[];   a就是数组名,表示数组控件首地址的指针常量 a = 0;是错误的,不允许对指针常量赋值 &a ...

  2. springmvc+jdbc连接数据库(第一个微商项目,代理注册)

    String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");手动自动生成Uuid ...

  3. Android Studio 自动生成 Java Doc

    Android Studio 生成 Java Doc 出现"编码GBK的不可映射字符"问题 错误的解决方案,复制粘贴一万遍也是错误的,下面是查找出来的,没有用的解决方案(还有几个, ...

  4. jfinal框架新手使用之路及开发心得

    从接触jfinal这个框架到现在差不多也有一个的时间了,因为之前接触的都是像spring ,springMVC,mybatis,struts2,hibernate这种传统,大多数公司都在用的这种框架. ...

  5. JavaScript中的设计模式:状态模式

    前几天写了一个贪吃蛇小游戏,正好用到了状态模式. 定义 当一个对象内部状态发生改变时候,会导致其行为的改变,这看起来像是改变了对象. 简单的例子 如果一个函数要更具某一个对象的状态来判断该对象应该执行 ...

  6. .Net中关于相等的问题

    在.Net框架中,如果您查看所有类型的的基类:System.Object类,将找到如下4个与相等判断的方法: static Equals() virtual Equals() static Refer ...

  7. LInux挂载windows共享磁盘

    #!/bin/sh #进行windows paths目录同步 cd /mnt str="//10.33.4.199/linux" result=$(df | grep ${str} ...

  8. 在Visual Studio 2017中发现的问题

    最近抽时间学习了一下 C# 6.0 的新特性,其中的一个新特性是 ?. 运算符,请看下面的一个简单示例: 当我故意修改成错误代码的时候,请接着看下面的示例: 我想把代码修改成list?[0].Coun ...

  9. 关于EasyUI中DataGrid控件的一些使用方法总结

    一,DataGrid         控件的工作流程 1,通过JavaScript将一个空白的div美化成一个空白的Datagrid模板 2,Datagrid模板通过制定的Url发送请求,获取数据   ...

  10. ios控制器生存周期

    iOS中控制器的生命周期 一般我们在创建控制器的时候,有三种方法. 1.  直接通过代码创建 2.  通过storyboard创建 3.  通过Xib,在创建控制器的时候传入一个Xib文件作为这个控制 ...