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

进入正题。

看过上一篇文章的童鞋们应该都清楚,之前的做法是通过输入不同的标签来生成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. 10最好用的Node.js工具、插件和资料库

    每一个称职的程序员都应该拥有一套极好的工具来提高自己的工作效率.在Livecoding.tv 上,那里的程序员分享了10个他们认为是最好用的工具.插件和资料库.据说,以下的这10个工具是使用Node. ...

  2. 4. web前端开发分享-css,js工具篇

    web前端开发乃及其它的相关开发,推荐sublime text, webstorm(jetbrains公司系列产品)这两个的原因在于,有个技术叫emmet, http://docs.emmet.io, ...

  3. web前端开发分享-css,js工具篇

    web前端开发乃及其它的相关开发,推荐sublime text, webstorm(jetbrains公司系列产品)这两个的原因在于,有个技术叫emmet, http://docs.emmet.io, ...

  4. Lo-Dash – 替代 Underscore 的优秀 JS 工具库

    前端开发人员大都喜欢 Underscore,它的工具函数很实用,用法简单.这里给大家推荐另外一个功能更全面的 JavaScript 工具——Lo-Dash,帮助你更好的开发网站和 Web 应用程序. ...

  5. 创建优雅表格的8个js工具

    当需要呈现数百个表的数据时,展示和可访问性扮演着至关重要的角色.在这种情况下,倘若一个数据网格能够支持大量数据集的HTML Table并提供诸如排序.搜索.过滤和分页等功能,那是棒棒哒.在这篇文章中, ...

  6. Node.js工具模块

    在Node.js的模块库中提供实用的模块数量. 这些模块都是很常见的,并同时开发基于任何节点的应用程序频繁使用. S.N. 模块的名称和说明 1 OS Module提供基本的操作系统相关的实用功能 2 ...

  7. css,js工具篇

    4. web前端开发分享-css,js工具篇   web前端开发乃及其它的相关开发,推荐sublime text, webstorm(jetbrains公司系列产品)这两个的原因在于,有个技术叫emm ...

  8. 分享非常好用的前端分页js工具类 灵活 简单易懂

    分享自己封装的前端分页js工具类  下面是默认样式效果截图 可以随意更改js及css 很灵活 /** * pageSize, 每页显示数 * pageIndex, 当前页数 * pageCount 总 ...

  9. 可在 html5 游戏中使用的 js 工具库

    可在 html5 游戏中使用的 js 工具库 作者: 木頭 时间: September 21, 2014 分类: Utilities,Game 使用 cocos2d-js 3.0 开发游戏项目两三个月 ...

随机推荐

  1. Codeforces Round #401 (Div. 2) A B C 水 贪心 dp

    A. Shell Game time limit per test 0.5 seconds memory limit per test 256 megabytes input standard inp ...

  2. 开发系统级应用不被Kill

    一.设置方法 (1) 在AndroidManifest中application根节点下,添加如下代码: android:persistent="true" (2) 将应用程序pus ...

  3. 读取txt内容放入set中

    package pingbi; /** * 将txt文本读入导入到set中 * 问题: * 第一个地方有会多一个 ?--解决问题很简单,但不知道问题的原因 */ import java.io.Buff ...

  4. Linux修改服务器ip

    Linux基础二(修改ip地址.修改网关.修改DNS服务器.重新启动网络配置)   网络的初始化 .ip地址的修改(临时生效) 使用ifconfig命令 ifconfig 网卡名 ip地址 netma ...

  5. CSS hack浏览器兼容一览表

    CSS hack是指我们为了兼容各浏览器,而使用的特别的css定义技巧.这是国外摘来的一张CSS hack列表,显示了各浏览器对css hack的支持程度,对我们制作兼容网页非常有帮助.

  6. 【BZOJ】3038: 上帝造题的七分钟2 && 3211: 花神游历各国

    [算法]线段树||树状数组&&并查集 [题解]修改必须暴力单点修改,然后利用标记区间查询. 优化:一个数经过不断开方很快就会变成1,所以维护区间最大值. 修改时访问到的子树最大值< ...

  7. 【洛谷 P5110】 块速递推(矩阵加速,分块打表)

    题目链接 掌握了分块打表法了.原来以前一直想错了... 块的大小\(size=\sqrt n\),每隔\(size\)个数打一个表,还要在\(0\text{~}size-1\)每个数打一个表. 然后就 ...

  8. 子div设置margin-top使得父div也跟着向下移动

    之前在写网页的时候,发现一个小问题,就是子div设置margin-top的时候,父的div也会跟着向下移动.我用代码和图描述一下问题: <span style="font-size:1 ...

  9. js jq插件 显示中文时间戳 刚刚 N分钟前 N小时前 今天 上午 下午 日期格式化

    注:页面需提前引用JQ ; $.fn.extend({ /* ** notes: 获取13位时间戳的简单操作 ** new Date('2018-02-01 15:10:00').getTime() ...

  10. Android--hardwareAccelerated 硬件加速详解 android:largeHeap="true"

    做项目时,引导页面的ViewPager报了OOM异常,图片并不大,在清单文件Application节点中添加了两行代码就解决了这个问题 android:hardwareAccelerated=&quo ...