这几天有小伙伴讨论起了分页的相关问题,这里我也简单讲下前端如何简单便捷的利用Js(库)写出优雅,好用的分页工具。

分页是个很简单又超多接触的技术点,粗略来讲分如下两种:

真分页——每次根据页码、页大小获取数据并展示。

假分页——一次性获取所有数据,根据页码、页大小展示。

公认比较好的做法是真分页,这样可以避免很多问题(如内存占用过多)。

有一点需要注意,单纯的前端是无法独立完成数据分页的(废话),所以后端支持是必须的。

作为支持,webapi除了返回所请求的数据,还应返回数据总量以便计算页数:

如上图所示,我们可以看出数据总量27,分页大小10(这边只请求了10条数据)。

如果你拥有如上图的webapi的支持,就可以接着往下写了。

我使用对象字面量封装的方法:

var Post = {
Url: function () {
return "webAPI路径";
},
///返回带分页信息
//[ele]填充信息元素ID
///[ele2]填充分页元素ID
//[tagName]信息元素一级元素名
///[tag2Name]信息元素二级元素名
//[index]页码
Pager: function (ele, ele2, tagName, tag2Name, index, where) {
//页大小
var size = $.cookie('pageSize') == undefined ? 10 : $.cookie('pageSize');
//封装的Ajax
Load(Post.Url(), {参数列表}, function (data) {
       //展示数据
$(ele).html(createHtml(data.rows, tagName, tag2Name));
//设置分页信息
$(ele2).attr('index', index).attr('rowcount', size).attr('total', data.total);
//填充分页
PagerTool(ele, ele2, Post, tagName, tag2Name, where);
});
}
}

Load、createHtml和PagerTool是我自己封装的几个方法,代码如下:

///公共加载方法
//[turl]访问地址
///[postData]提交数据(标准post格式)
//[callback]回调函数(可匿名)
function Load(turl, postData, callback) {
jQuery.support.cors = true;
try {
$.ajax({
url: turl,
timeout: 10000,
type: "post",
data: postData,
success: function (data) {
if (data != null) {
Json = eval("(" + data + ")");
callback(Json);
}
}
});
} catch (e) {
Mbox.Show(e.message);
}
} ///创建Html结构
//[data]数据源
///[tagName]一级元素标签名称
//[tag2Name]二级元素标签名称
function createHtml(data, tagName, tag2Name) {
var Html = '';
for (var i = 0; i < data.length; i++) {
Html += `<${tagName}>`;
$.each(data[i], function (i, v) {
Html += `<${tag2Name}>${v}</${tag2Name}>`;
});
Html += `</${tagName}>`;
}
return Html;
}

PagerTool方法:

//公共分页工具条
///[dataEle]数据主体
//[ele]分页主体
///[obj]被传入的类
//[where]条件
///[w]按照何种方式搜索
function PagerTool(dataEle, ele, obj, tag1, tag2, where) {
var total = $(ele).attr('total') - 0;
var rowcount = $(ele).attr('rowcount') - 0;
var index = $(ele).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>';
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 += '</p>';
$(ele).html('').html(Html);
//上一页
$(ele).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);
obj.Pager(dataEle, ele, tag1, tag2, index - 1, where);
}
});
//下一页
$(ele).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);
obj.Pager(dataEle, ele, tag1, tag2, index + 1, where);
}
});
//当前页
$(ele).find('a[class=nowPage]').bind('click', function () {
var index = $(this).parent().parent().attr('index') - 0;
$(this).parent().parent().attr('index', $(this).text());
obj.Pager(dataEle, ele, tag1, tag2, $(this).text(), where);
});
}

调用方式会是这样的:

Post.Pager(testBox, pagerBox, 'ul', 'li', 1, `筛选数据的条件`);

使用了如上代码,即可按照所返回的json数据的格式自动映射到容器内(按照传入的tagName生成dom):

切换后效果:

分页工具条,生成在页面是这样的:

<p class="page">
<a href="javaScript:void(0)" class="prePage">上一页</a>
<a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">1</a>
<a href="javaScript:void(0)" class="nowPage">2</a>
<a href="javaScript:void(0)" class="nowPage">3</a>
<a href="javaScript:void(0)" class="nextPage">下一页</a>
</p>

此工具写与2个月前,如今看来仍有很多地方需要改进,希望大家多多提意,欢迎讨论。

Js处理数据——前端分页工具的更多相关文章

  1. Django中使用JS通过DataTable实现表格前端分页,每页显示页数,搜索等功能

    Django架构中自带了后端分页的技术,通过Paginator进行分页,前端点击按钮提交后台进行页面切换. 优缺点:后端分页对于数据量大的场景有其优势,但页面切换比较慢. 后端分页python3代码如 ...

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

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

  3. js前端分页之jQuery

    锋利的js前端分页之jQuery 大家在作分页时,多数是在后台返回一个导航条的html字符串,其实在前端用js也很好实现. 调用pager方法,输入参数,会返回一个导航条的html字符串.方法的内部比 ...

  4. 自写JS分页工具【基于JQ】

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

  5. js 前端分页空间控件

    现在web注重用户体验与交互性,ajax 提交数据的方式很早就流行了,它能够在不刷新网页的情况下局部刷新数据.前端分页多是用ajax请求数据(其他方式也有比如手动构造表单模拟提交事件等).通过js将查 ...

  6. 纯JS前端分页方法(JS分页)

    1.JS分页函数:开发过程中,分页功能一般是后台提供接口,前端只要传page(当前页码)和pageSize(每页最大显示条数)及对应的其他查询条件,就可以返回所需分页显示的数据. 但是有时也需要前端本 ...

  7. js实现前端分页页码管理

    用JS实现前端分页页码管理,可以很美观的区分页码显示(这也是参考大多数网站的分页页码展示),能够有很好的用户体验,这也是有业务需要就写了一下,还是新手,经验不足,欢迎指出批评! 首先先看效果图: 这是 ...

  8. Node.js前端自动化工具:gulp

    前端自动化工具 -- gulp 使用简介 gulp是基于流的前端自动化构建工具. 之前也谈到了 grunt的用法,grunt其实就是配置+配置的形式. 而gulp呢,是基于stream流的形式,也就是 ...

  9. 前端构建工具 Gulp.js 上手实例

    在软件开发中使用自动化构建工具的好处是显而易见的.通过工具自动化运行大量单调乏味.重复性的任务,比如图像压缩.文件合并.代码压缩.单元测试等等,可以为开发者节约大量的时间,使我们能够专注于真正重要的. ...

随机推荐

  1. 密钥,密钥对,公钥,pfx,jks和https的几个概念

    密钥: 我理解是公钥+私钥的统称. 密钥对: 公钥(证书)和私钥成对存在. 通信双方各持有自己的私钥和对方的公钥.自己的私钥需密切保护,而公钥是公开给对方的.在windows下,单独存在的公钥一般是后 ...

  2. 漏洞大爆光:QQ漏洞、飞秋漏洞、360浏览器劫持…

    随着互联网应用的高速发展,信息安全已深入到诸多领域,前段时间发生的"Struts 2"漏洞及"心脏出血"漏洞影响了二亿中国网民的信息安全.原因是程序猿缺少细致的 ...

  3. 在MyEclipse中如何去掉JS或jsp语法错误提示!

    在MyEclipse中如何去掉JS或jsp语法错误提示! 关于在 MyEclipse 上 WEB 工程里面的 JS/JSP 经常会有语法错误提示,这是由于 MyEclipse 对其语法要求相当严格所造 ...

  4. 【转】MyEclipse第一个Servlet程序

    转自:http://blog.csdn.net/wangdingqiaoit/article/details/7674367 前言 本文旨在帮助学习java web开发的人员,熟悉环境,在Win7系统 ...

  5. MAC终端显示隐藏文件,关闭显示

    1.显示隐藏文件夹显示:defaults write com.apple.finder AppleShowAllFiles -bool true (1)复制“defaults write com.ap ...

  6. docker daemonize sshd service

    # 第一个-d表示让容器在后台运行 # 末尾的-D表示启动ssh的daemon模式,不然容器启动后立刻就变为停止状态了 docker run -d NAME/VERSION /etc/init.d/s ...

  7. 布隆过滤器(Bloom Filter)

    一.布隆过滤器介绍 Bloom Filter是一种空间效率很高的随机数据结构,Bloom Filter可以看做是对bit-map的扩展,它的原理如下: 当一个元素被加入集合时,通过K个Hash函数将这 ...

  8. IE6下Png透明最佳解决方案(推荐) Unit PNG Fix

    引自:http://www.yeeyan.org/articles/view/98510/67784 网络上解决IE6下Png透明解决方案有很多,例如 IE PNG Fix from TwinHeli ...

  9. php中实现精确设置session过期时间的方法

    http://www.jb51.net/article/52309.htm 大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下sessio ...

  10. c#md5与SHA1验证函数

    /// <summary> /// MD5验证函数 /// </summary> /// <param name="fileName">文件的路 ...