一、背景
         之前在秒针工作的时候,某js高级工程师写了很多自己的组件,其中一套是分页组件,叫做st-grid。不过在我看来,bug太多,我经常给他反馈bug,我也不清楚为啥别人没有发现。
    回到武汉工作后,我自己利用业余实践完善自己的官网,从前端到后端,都是自己一个人亲自搞定。
    第1个分页的需求是,文章下方的评论,异步加载。第2个需求是,表格管理,比如后台管理系统,经常需要列出user、log等表的记录。

  二、实例
 <table class="table table-bordered table-hover table-condensed" >

<thead>
<tr>
<th>名字</th>
<th>银行机构码</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="bodyHolder"></tbody>
</table>
<div id="pageHolder"></div>
</div>
<script>
var formatStatus = function(value) {
var strStatus = "";
if (value == 1) {
strStatus = "无效";
} else if (value == 11) {
strStatus = "待审核";
} else if (value == 21) {
strStatus = "审核通过";
}
return strStatus;
};
(function() {
var fuPage = new FuPage(
{
"url" : "${base}/bank/list.json",
"params" : {
"pageNo" : 1,
"pageSize" : 10
},
"isTable" : true,
"bodyHolder" : "bodyHolder",
"pageHolder" : "pageHolder",
"tableTemplate" : "<tr><td>{name}</td><td>{bankcode}</td><td>@formatStatus({status})</td>"
+ "<td><a href='${base}/bank/edit.html?id={id}'>编辑</a>|"
+ "<a href='javascript:;' onclick='pass(\"{id}\",\"{name}\");'>审核通过</a>|"
+ "<a href='javascript:;' onclick='unpass(\"{id}\",\"{name}\");'>审核失败</a>"
+ "</tr>"
});
fuPage.send();
})();
</script>

三、实例解读
   1.定义table
     这个地方不是关键,主要是,确定表头。
     表头一般是固定的。
     目前的设计是,表头就是开发者自己写死。(我遇到的需求基本都是这样)

2.定义2个容器-holder
    bodyHolder,名字可以随便取,只不过要对应。
    fupage会把表的主体内容,放在这个div里。

pageHolder,存放分页,比如“上一页”、“下一页”等。

3.定义FuPage对象,向后台请求数据。
  var fuPage = new FuPage({..}); 
  fuPage.send();

4.参数。
  url:后台请求路径
  params:参数
  bodyHolder,pageHolder,容器的id
  tableTemplate,一行数据row的模版。

5.模版渲染
   解析变量,{varName}。
  自定义函数。
  比如
    <td>@formatStatus({status})</td>

function formatStatus(status){

}

四、设计思路 

    /**
 * FansUnion Page Library v1.0.7
 * LastUpdate:2015-3-13
 * Copyright 2012~2112, xiaolei
 * QQ: 240370818
 * Email:fansunion@qq.com
 *
 */
/**
 * 分页组件,可以作为自定义内容或者标准型表格的分页,比如文章评论,user列表。 表格分页,模版由外界传入。
 * <br/>提供给用户的构造表格的方法主要有2个:构造方法 new FuPage(options)和发送数据请求send(params)。
 * 事件通知方法有:onfilled,onedited,onerror(暂时没有)
 */
function FuPage(options) {
this.url = options.url;
this.params = options.params;
this.startNo = 1;
this.endNo = 1;
this.tableTemplate = options.tableTemplate;
this.bodyHolder = options.bodyHolder;
this.pageHolder = options.pageHolder;
}
// 向后端发送请求
FuPage.prototype.send = function(params) {
var that = this;
// console.log(params);
if (typeof params == 'object') {
$.each(params, function(p, val) {
that.params[p] = val;
})
}
console.log("FuPage params:" + that.params);
$.post(this.url, this.params, function(data) {
var page = data.page;
if (!page) {
// console.error("page is null,data is "+data);
data = $.parseJSON(data);
page = data.page;
}
that.renderTable(page);
renderPage(that, page);
addPageEvent(that, page);
});
}
// 渲染表格主体
FuPage.prototype.renderTable = function(page) {
// var ok = this.isTable && this.tableTemplate != null;
if (!this.tableTemplate) {
console.error("tableTemplate is null");
return false;
}
var divs = '';
$("#" + this.bodyHolder).html(divs);
}
// 未定义的变量,用""展示
var nullToEmpty = function(value) {
if (value == null || value == undefined) {
value = "";
}
return value;
}
// 渲染分页栏
function renderPage(fuPage, page) {
var pageDiv = buildPage(fuPage, page);
$("#" + fuPage.pageHolder).html(pageDiv);
}
// 为分页超链接绑定click事件
function addPageEvent(fuPage, page) {
// 解决同一个页面,多个实例导致ID冲突的问题
var prefix = fuPage.pageHolder;
var nextPageA = document.getElementById(prefix + "nextPageA");
if (nextPageA != null) {
nextPageA.onclick = function() {
goToPage(fuPage, fuPage.params.pageNo + 1)
};
}
var prevPageA = document.getElementById(prefix + "prevPageA");
if (prevPageA != null) {
prevPageA.onclick = function() {
goToPage(fuPage, fuPage.params.pageNo - 1)
}
}
var beginPageA = document.getElementById(prefix + "beginPageA");
if (beginPageA) {
beginPageA.onclick = function() {
goToPage(fuPage, 1);
}
}
var endPageA = document.getElementById(prefix + "endPageA");
if (endPageA != null) {
endPageA.onclick = function() {
goToPage(fuPage, page.totalPage)
}
}
for (var no = fuPage.startNo; no <= fuPage.endNo; no++) {
var id = prefix + "noPageA" + no;
// console.log(id);
var noPageA = document.getElementById(id);
if (noPageA != null && no != fuPage.pageNo) {
$("#" + id).on("click", function(e) {
// 找到事件源,事件源的文本内容"1"即为页数,string转换成int,防止str+int结果是string
var number = $(this).text();
// 把string转换成int类型
number = new Number(number);
goToPage(fuPage, number)
});
}
}
}
// 加载指定的页面
function goToPage(fuPage, no) {
fuPage.params.pageNo = no;
fuPage.send();
}
// 构造分页栏的html,记得给第“1”页等按钮,绑定事件
function buildPage(fuPage, page) {
var totalPage = page.totalPage;
var pageNo = page.pageNo || 1;
var pageSize = page.pageSize;
var totalCount = page.totalCount;
if (totalCount <= 0) {
console.log("totalCount=0")
return "";
}
// 半距离算法
var half = 5;
var startNo = 1;
var endNo = totalPage;
var left = pageNo - half;
var right = pageNo + half;
if (left < 1) {
startNo = 1;
} else {
startNo = left;
}
if (right > totalPage) {
endNo = totalPage;
} else {
endNo = right;
}
fuPage.startNo = startNo;
fuPage.endNo = endNo;
var prefix = fuPage.pageHolder;
// 分页链接,绑定事件
var ul = '<ul class="pagination">';
if (pageNo == 1) {
ul += '<li class="disabled"><span>首页</span></li><li><span>上一页</span></li>';
} else {
ul += '<li><a href="javascript:;" id="' + prefix
+ 'beginPageA">首页</a></li><li><a href="javascript:;" id="'
+ prefix + 'prevPageA">上一页</a></li>';
}
for (var no = startNo; no <= endNo; no++) {
if (no == pageNo) {
ul += '<li class="active"><a href="javascript:;">' + no
+ '</a></li>';
} else {
ul += '<li><a href="javascript:;" id="' + prefix + 'noPageA' + no
+ '" >' + no + '</a></li>';
}
}
if (pageNo == totalPage)
ul += '<li class="disabled"><span>下一页</span></li><li class="disabled"><span>尾页</span></li>';
else {
ul += '<li><a href="javascript:;" id="' + prefix
+ 'nextPageA" >下一页</a></li><li><a href="javascript:;" id="'
+ prefix + 'endPageA">尾页</a></li>';
}
ul += '<li><span>共' + totalPage + '页</span></li><li><span>共' + totalCount
+ '条</span></li></ul>';
return ul;
}

JS表格分页组件:fupage的设计思路和具体用法(未来考虑开源,争取在2015年)的更多相关文章

  1. JS表格分页组件:fupage的设计思路和详细使用方法(未来考虑开源,争取在2015年)

    一.背景         之前在秒针工作的时候,某js高级project师写了非常多自己的组件.当中一套是分页组件.叫做st-grid. 只是在我看来,bug太多.我常常给他反馈bug,我也不清楚为啥 ...

  2. 基于Vue.js的表格分页组件

    有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋 ...

  3. Vue.js的表格分页组件

    转自:http://www.cnblogs.com/Leo_wl/p/5522299.html 有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更 ...

  4. iOS 组件化 —— 路由设计思路分析

    原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构.更换适合业 ...

  5. JS表格分页(封装版)

    HTML代码: <html> <head> <meta charset='utf-8'> <script type="text/javascript ...

  6. 基于iview 封装一个vue 表格分页组件

    iview 是一个支持中大型项目的后台管理系统ui组件库,相对于一个后台管理系统的表格来说分页十分常见的 iview是一个基于vue的ui组件库,其中的iview-admin是一个已经为我们搭好的后天 ...

  7. vue2.0分页组件,

    pagination.vue <!-- 表格分页组件 --> <template> <nav class="boot-nav"> <ul ...

  8. 基于 bootstrap 的 vue 分页组件

    申手党点这里下载示例 基于 bootstrap 的 vue 分页组件,我想会有那么一部分同学,在使用Vue的时候不使用单文件组件,因为不架设 NodeJS 服务端.那么网上流传的 *.vue 的各种分 ...

  9. 电子商务系统的设计与实现(十三):分页组件,从前到后,从JS到Java

    一.概述   学习实践Web开发5年多了,直到今天,我才算真正实现了最基本最常用的分页组件. 包括:    a.前端JS异步加载并渲染:    b.前端JSP.Freemarker.Struts标签渲 ...

随机推荐

  1. CISP/CISA 每日一题 18

    CISSP 每日一题(答)What is the purpose of an access review and audit? Checkto ensure that users do not hav ...

  2. 洛谷 P1724 东风早谷苗

    洛谷 P1724 东风早谷苗 题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女.某一天,早苗终于入手了最新款的钢达姆模型.作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走, ...

  3. ubuntu-安装中文拼音输入法

    一下内容转载自http://blog.chinaunix.net/uid-24410388-id-3501873.html 自己验证了可用.转载了,已留做日后使用 步骤: step1:安装ibus所需 ...

  4. 开源课程管理系统(CMS):Moodle

    开源课程管理系统(CMS):Moodle 一.总结 1.php开发的cms,可借鉴参考用 二.Moodle(百度) Moodle(Modular Object-Oriented Dynamic Lea ...

  5. Android Studio com.android.dex.DexException: Multiple dex files define(重复引用包)

    如果你用Android Studio开发,并且要用其他项目作为library,这个问题是很容易出现的.出现这个问题的原因是包的重复引用,意思就是在你自己的项目中引用了某个包,而被你作为library的 ...

  6. Dynamics CRM2016 Web API之Expand related entities &amp; $ref &amp; $count

    本篇介绍两个关于1:N关系中通过主实体取关联子实体的api,这两个api会常常被用到并且比原来的odata方式更加方便.之前假设我们要取主实体下全部的关联实体的记录都是通过Retrieve Multi ...

  7. 关于YUM错误,Error: rpmdb open failed

    错误如题: rpmdb: Thread/process / failed: Thread died in Berkeley DB library error: db3 error(-) from db ...

  8. tomcat的classloader机制

    本系列博客打算分析一下tomcat7.x的源码,其中可能会穿插一些java基础知识的介绍  读tomcat的源码的时候,我建议和官方的User Guide一起阅读,明白tomcat做某件事情的目的之后 ...

  9. LeetCode Algorithm 04_Median of Two Sorted Arrays

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  10. jQuery的实现原理和核心

    1.jQuery的实现原理 1)jQuery采用的是构造函数模式进行开发的,jQuery是一个类 2)上面说的常用的方法(CSS.属性.筛选.事件.动画.文档处理)都是定义在jQuery.protot ...