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

进入正题。

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

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

    ///分页工具生成
//dataEle-数据盒子
//pageEle-分页盒子
//obj-调用方法传递
//url-传递方法内参
//cndt-传递方法内参
//ishow-传递方法内惨
pagerTool: function (dataEle, pageEle, obj, url, cndt, ishow) {
var total = $(pageEle).attr('total') - 0;//总数
var rowcount = $(pageEle).attr('rowcount') - 0;//页尺寸
var index = $(pageEle).attr('index') - 0;//页码
var count = total % rowcount == 0 ? total / rowcount : Math.floor(total / rowcount) + 1;//总页数
var Html = '';
Html += '<p class="page">';
Html += '<a href="javaScript:void(0)" class="prePage">上一页</a>';
//总量大于15页时,生成转跳选择框并隐藏多余页码按钮
if (count > 15) {
//优化视觉效果
if (index <= 8) {
for (var i = 1; i <= 15; i++) {
if (index != i) {
Html += '<a href="javaScript:void(0)" class="nowPage">' + i + '</a>';
} else {
Html += '<a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">' + i + '</a>';
}
}
} else {
var s = index - 8 + 1;
if (s + 14 > count) {
var c = s + 14 - count;
s = s - c;
}
for (var i = s ; i <= s + 14; i++) {
if (index != i) {
Html += '<a href="javaScript:void(0)" class="nowPage">' + i + '</a>';
} else {
Html += '<a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">' + i + '</a>';
}
}
}
Html += '<a href="javaScript:void(0)">转到</a>';
Html += '<select class="nowPage">';
for (var i = 1; i <= count; i++) {
Html += '<option>' + i + '</option>';
}
Html += '</select>';
Html += '<a href="javaScript:void(0)">页</a>';
} else {
for (var i = 1; i <= count; i++) {
if (index != i) {
Html += '<a href="javaScript:void(0)" class="nowPage">' + i + '</a>';
} else {
Html += '<a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">' + i + '</a>';
}
}
}
Html += '<a href="javaScript:void(0)" class="nextPage">下一页</a>';
Html += '共有' + total + '条数据';
Html += '</p>';
$(pageEle).html(Html);
$(pageEle).find('select').val(index);
//上一页
$(pageEle).find('a[class=prePage]').bind('click', function () {
var index = $(this).parent().parent().attr('index') - 0;
if (index > 1) {
$(this).parent().parent().attr('index', index - 1);
cndt.index = cndt.index - 1;
obj(url, cndt, dataEle, pageEle, ishow);
} else {
alert('还想去哪儿啊,这是第一页~');
}
});
//下一页
$(pageEle).find('a[class=nextPage]').bind('click', function () {
var index = $(this).parent().parent().attr('index') - 0;
if (index < count) {
$(this).parent().parent().attr('index', index + 1);
cndt.index = (cndt.index - 0) + 1;
obj(url, cndt, dataEle, pageEle, ishow);
} else {
alert('别翻了,后面没有了~');
}
});
//当前页
$(pageEle).find('a[class=nowPage]').bind('click', function () {
var index = $(this).parent().parent().attr('index') - 0;
$(this).parent().parent().attr('index', $(this).text());
cndt.index = $(this).text();
obj(url, cndt, dataEle, pageEle, ishow);
});
//指定页转跳
$(pageEle).find('select[class=nowPage]').bind('change', function () {
console.log(11111111111);
var index = $(this).parent().parent().attr('index') - 0;
$(this).parent().parent().attr('index', $(this).val());
cndt.index = $(this).val();
obj(url, cndt, dataEle, pageEle, ishow);
});
}

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

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

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

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

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

如上,在 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. WIN10下设置惠普HP1050等打印机打印颜色,只打黑白或彩色

    今天同事问了一个问题,如何在WIN10下,设置惠普打印机只打印黑白, 上网搜了下,没有找到任何信息,只有在WIN8前系统设置的内容,经过几番折腾,得出此文. WIN10下设置惠普HP1050等打印机打 ...

  2. PHP中定义常量define与const

    我们通常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,也可减少团队开发的出错.那么define和const有什么区别呢? 1.const是一个语言结构:而define是一个函数 ...

  3. Hadoop hdfs上传文件 权限问题

    问题描述: hadoop在虚拟机中的linux系统下 在本地通过eclipse编写代码把本地文件上传至hadoop平台的指定目录 代码如下: @Test public void upload() th ...

  4. Tomcat启动中的一些问题

    (a)在eclipse中启动tomcat,在控制台加载的配置却是其他项目的,有时候也不是自己工作空间里的? 出现的一个原因是:在我tomcat的webapp目录下,我放了一个其他项目的war包,在to ...

  5. Pivot Table系列之切片器 (Slicer)

    1. 遇到的问题: 在Excel中,用PivotTable来做数据报告展示: 问题1:在同一个Sheet页里,多个PivotTable如何实现同步刷新? 问题2:在不同Sheet页之间,多个Pivot ...

  6. SQL Server事务遭遇网络异常时的处理机制浅析

    SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Server数据库是通过什么机制来判断处理呢? 估计很多人 ...

  7. vscode 开发.net core 从安装到部署 教程详解

    一:环境准备: windows系统需要 win7 sp1 / windows 8  / windows 2008 r2 sp1 / windows10: 其他版本的windows系统在安装.NET C ...

  8. react 入门教程 阮一峰老师真的是榜样

    -  转自阮一峰老师博客 React 入门实例教程   作者: 阮一峰 日期: 2015年3月31日 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Nati ...

  9. thinkphp实现无限级分类

    普通的方法(采用for和foreach) //显示 foreach($data as $k=>$v){ //str_repeat()函数用于把字符串重复指定的次数 $data[$k]['titl ...

  10. vue+mockjs 模拟数据,实现前后端分离开发

    在项目中尝试了mockjs,mock数据,实现前后端分离开发. 关于mockjs,官网描述的是 1.前后端分离 2.不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据. 3.数据类型丰 ...