任务背景及需求

按页面上的现成表格,用js生成新的统计表格如下:

实现思路

1,把表格数据抽取出来生成json数组

2,计算表格总数并创建空表格

3,历遍json数组把数据动态插入所有的表格,设值/append Row

4,最后配置好所有表格的属性如thead,rowspan等

详细代码

/**
* @create: nelson
* @initBPDTable 初始化表格内容
* @调用方式
$("#main_content").initBPDTable(list);
*/
$.fn.extend({
//获取listView的数据转化为json数组
getJsonArrFromListView: function (linkCol) {
var This = $(this);
var keyArr = new Array(),
jsonArr = new Array();
This.find("thead th").each(function () {
keyArr.push($(this).text().trim());
});
This.find("tbody tr").each(function () {
var jsonObj = {};
$(this).find("td").each(function (n) {
if (n != linkCol) {
jsonObj[keyArr[n]] = $(this).text().trim();
}
else
jsonObj[keyArr[n]] = $(this).find("a").attr("href");
});
jsonArr.push(jsonObj);
});
return jsonArr;
},
initBPDTable: function (list) {
var This = $(this),
$list = $(list);
var keyArr = new Array(),
jsonArr = new Array(),
yearArr = new Array(); jsonArr = $list.getJsonArrFromListView(3);
//计算起始年份
var startYear = (function (jsonArr) {
var result = 2000;
$.each(jsonArr, function (entryIndex, entry) {
var temp = Number(entry['CY']);
if (temp > result) {
result = temp;
}
});
return result - 4;
})(jsonArr);
//构建表格
(function (jsonArr, startYear) {
var tableTpl = '<table class="itm_table"><thead><tr><th></th><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody><tr class="odd"><td rowspan="1">{tableTitle}</td><td></td><td></td><td></td><td></td><td></td></tr></tbody></table>';
var configs = {
titleArr: new Array(),
col: 5,
strHtml: "",
targetJsonArr: new Array(),
tLength: function () { return this.titleArr.length; }
};
$.each(jsonArr, function (entryIndex, entry) {
for (var i = 0; i < 5; i++) {
if (entry['CY'] == startYear + i) {
configs.targetJsonArr.push(entry);
var title = entry['Project Type'];
if (configs.titleArr.length == 0) {
configs.titleArr.push(title);
}
else {
var newTitleFlag = true;
for (var j = 0; j < configs.titleArr.length; j++) {
if (configs.titleArr[j] == title) {
newTitleFlag = false;
break;
}
}
if (newTitleFlag) {
configs.titleArr.push(title);
}
}
}
}
});
//生成空表格
for (var i = 0; i < configs.tLength(); i++) {
configs.strHtml += tableTpl.replace("{tableTitle}", configs.titleArr[i]);
}
This.html(configs.strHtml);
//插入数据
var jArr = configs.targetJsonArr;
$.each(jArr, function (entryIndex, entry) {
var title = entry['Project Type'],
cy = entry['CY'],
link = entry['Project Link'],
name = entry['Project Name'];
for (var i = 0; i < 5; i++) {
if (cy == startYear + i) {
for (var j = 0; j < configs.tLength(); j++) {
if (title == configs.titleArr[j]) {
var needAppend = true,
isOddRow;
This.find(".itm_table:eq(" + j + ")").find("tbody>tr").each(function (n) {
var obj = $(this),
self = (n == 0) ? obj.find("td:eq(" + (i + 1) + ")") : obj.find("td:eq(" + i + ")");
isOddRow = (obj.attr("class") == "odd");
if (self.html() == "") {
self.html('<a href="' + link + '">' + name + '</a>');
needAppend = false;
return false;
}
});
if (needAppend) {
var oddTpl = '<tr class="odd"><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td></tr>',
evenTpl = '<tr class="even"><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td></tr>',
reg = new RegExp("{\\d{1}}", "g");
if (isOddRow) {
This.find(".itm_table:eq(" + j + ")").find("tbody").append(evenTpl.replace('{' + i + '}', '<a href="' + link + '">' + name + '</a>').replace(reg, ""));
}
else {
This.find(".itm_table:eq(" + j + ")").find("tbody").append(oddTpl.replace('{' + i + '}', '<a href="' + link + '">' + name + '</a>').replace(reg, ""));
}
}
}
}
}
}
});
//初始化年份显示
This.find(".itm_table:eq(0)").find("thead").html('<tr>'
+ '<th></th>'
+ '<th><img src="/images/arrow_red.png" /><span class="cy">CY2014</span></th>'
+ '<th><img src="/images/arrow_green.png" /><span class="cy">CY2015</span></th>'
+ '<th><img src="/images/arrow_purple.png" /><span class="cy">CY2016</span></th>'
+ '<th><img src="/images/arrow_blue.png" /><span class="cy">CY2017</span></th>'
+ '<th><img src="/images/arrow_orange.png" /><span class="cy">CY2018</span></th>'
+ '</tr>');
This.find(".itm_table:eq(0)").find(".cy").each(function (n) {
yearArr.push((startYear + n).toString());
$(this).text("CY" + yearArr[n]);
});
//初始化行的rowspan
This.find(".itm_table").each(function () {
var self = $(this);
var len = self.find("tbody>tr").length;
self.find("tbody>tr:first").find("td:eq(0)").attr("rowspan", len);
}); })(jsonArr, startYear); }
});

Javascript/jQuery根据页面上表格创建新汇总表格的更多相关文章

  1. jQuery为图片添加链接(创建新的元素来包裹选中的元素)

    主要用到 wrap()函数 http://www.w3school.com.cn/jquery/manipulation_wrap.asp 这个函数是创建新的的元素去包裹所执行这个方法的元素 如下例子 ...

  2. jquery 在页面上根据ID定位(jQuery锚点跳转及相关操作) 经典

    1.锚点跳转简介 Edit 锚点其实就是可以让页面定位到某个位置上的点.在高度较高的页面中经常见到.比如百度的百科页面,wiki中的page内容. 我知道实现锚点的跳转有两种形式,一种是a标签+nam ...

  3. Jquery实现页面上所有的checkbox只能选中一个

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  4. jquery 在页面上根据ID定位(jQuery锚点跳转及相关操作)

    JQuery下锚点的平滑跳转 对于锚点的平滑跳转,在一般的商业性质的网站上,权衡来说,要谨慎使用. 例如:让页面平滑滚动到一个id为box的元素处,则JQuery代码只要一句话,关键位置 如下: $( ...

  5. JavaScript实现在页面上的文本框中输入小写字母自动变为大写字母

    <script language="javascript" type="text/javascript"> $(function () { $(&q ...

  6. 使用JavaScript实现在页面上所有内容加载完之前一直显示loading...页面

    Html <body class="is-loading"> <div class="curtain"> <div class=& ...

  7. 使用JavaScript把页面上的表格导出为Excel文件

    如果在页面上展示了一个数据表格,而用户想把这个表格导出为Excel文件,那么在要求不高的情况下,可以不通过服务器生成表格,而是直接利用JavaScript的Blob和Object URL特性将表格导出 ...

  8. 创建新用户,及用新用户名和密码登录--------------DCL

    创建用户基本语法:    creat user 用户名@"ip地址" identified by "密码" 登录数据库以后:用show databases; 显 ...

  9. git 创建新项目,下载工程,合并和更新工程简单应用记录

    以前使用SVN很顺手,现在公司使用git来管理代码,因此学习git的基本使用. 一.首先介绍下SVN和git的简单比较: SVN是使用得最多的版本控制管理工具. 1.是一个集中式的版本管理工具.所有的 ...

随机推荐

  1. [Unity3D]导入模型并且设置相应的属性

    将资源拷贝到Assets中并设置 首先确保法线贴图的属性如下: 设置基本贴图和法线贴图 因为要发布到移动端,设置shader属性: 为了设置更好的反光效果,添加cubemap: 添加新的Materia ...

  2. mysql问题

    mysql x64,由于没有msi版,因此,在使用上可能会出现一些问题. 一.  配置环境变量: 只需把mysql/bin文件夹地址完整地添加到Path中,用“;”与前面的参数隔开.需注意,mysql ...

  3. 在 Github 上找「好东西」的方法

    使用 Github 的站内搜索,搜索: Awesome + 你的关键字

  4. nyoj220 推桌子(贪心算法)

    这道题太坑了,from 和to有可能写反,还得正过来: 推桌子 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 The famous ACM (Advanced Co ...

  5. 子类可以有跟父类中同名的方法,但是会重写父类中的方法,甚至是root class中的方法

    /* 子类可以重写父类中的方法,甚至是root class中的方法,比如NSObeject 的new方法,但是后提示警告如下 Method is expected to return an insta ...

  6. cf126b(kmp好题)

    http://codeforces.com/contest/126/problem/B #include<bits/stdc++.h> using namespace std; const ...

  7. Apache不重新编译,利用apxs工具给Apache添加模块,如cgi模块

    想实践下Apache是如何运行cgi程序的,却发现先前编译安装Apache的时候,没有安装Apache的cgi模块. 附:CentOS6.x编译安装LAMP(2):编译安装 Apache2.2.25 ...

  8. SVN版本控制与分支设置

    使用SVN+Eclipse做软件版本控制. (2009年5月) 1,SVN目录结构 Trunk : 主干目录,此目录下的文件为基准文件 Branches : 用于开发的分支目录 Tags : 用于发布 ...

  9. 网站建设中帝国cms如何循环调用栏目下级分类

    类似的形式,调用下级分类 ?php $bclassid=[!--self.classid--]; //选择当前栏目的id,如果调用指定栏目下的多级分类,则填写栏目id //取得本栏目下的子栏目 ? [ ...

  10. 在 IIS 6 和 IIS 7中配置Https,设置WCF同时支持HTTP和HTPPS,以及使用HttpWebRequest和HttpClient调用HttpS

    IIS 7 ,给IIS添加CA证书以支持https IIS 6 架设证书服务器 及 让IIS启用HTTPS服务 WCF IIS 7中配置HTTPS C#利用HttpWebRequest进行post请求 ...