Javascript/jQuery根据页面上表格创建新汇总表格
任务背景及需求
按页面上的现成表格,用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根据页面上表格创建新汇总表格的更多相关文章
- jQuery为图片添加链接(创建新的元素来包裹选中的元素)
主要用到 wrap()函数 http://www.w3school.com.cn/jquery/manipulation_wrap.asp 这个函数是创建新的的元素去包裹所执行这个方法的元素 如下例子 ...
- jquery 在页面上根据ID定位(jQuery锚点跳转及相关操作) 经典
1.锚点跳转简介 Edit 锚点其实就是可以让页面定位到某个位置上的点.在高度较高的页面中经常见到.比如百度的百科页面,wiki中的page内容. 我知道实现锚点的跳转有两种形式,一种是a标签+nam ...
- Jquery实现页面上所有的checkbox只能选中一个
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- jquery 在页面上根据ID定位(jQuery锚点跳转及相关操作)
JQuery下锚点的平滑跳转 对于锚点的平滑跳转,在一般的商业性质的网站上,权衡来说,要谨慎使用. 例如:让页面平滑滚动到一个id为box的元素处,则JQuery代码只要一句话,关键位置 如下: $( ...
- JavaScript实现在页面上的文本框中输入小写字母自动变为大写字母
<script language="javascript" type="text/javascript"> $(function () { $(&q ...
- 使用JavaScript实现在页面上所有内容加载完之前一直显示loading...页面
Html <body class="is-loading"> <div class="curtain"> <div class=& ...
- 使用JavaScript把页面上的表格导出为Excel文件
如果在页面上展示了一个数据表格,而用户想把这个表格导出为Excel文件,那么在要求不高的情况下,可以不通过服务器生成表格,而是直接利用JavaScript的Blob和Object URL特性将表格导出 ...
- 创建新用户,及用新用户名和密码登录--------------DCL
创建用户基本语法: creat user 用户名@"ip地址" identified by "密码" 登录数据库以后:用show databases; 显 ...
- git 创建新项目,下载工程,合并和更新工程简单应用记录
以前使用SVN很顺手,现在公司使用git来管理代码,因此学习git的基本使用. 一.首先介绍下SVN和git的简单比较: SVN是使用得最多的版本控制管理工具. 1.是一个集中式的版本管理工具.所有的 ...
随机推荐
- C#对文件/目录的操作:Path、File、Directory、FileStream、StreamReader、StreamWriter等类的浅析
以下类的命名空间都是:System.I/0; 一.Path:主要对文件路径的操作! 常用方法: String path=@"C:\a\b\c\123.txt"; 1-1.Path. ...
- 30个要点帮你完成java代码优化
通过java代码规范来优化程序,优化内存使用情况,防止内存泄露 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容 ...
- php htmlentities函数的问题
看到在细说php第二版教程中的函数htmlentities 例子,实际实验没有效果 $str = "一个 'quote' 是<b>bold</b>";ech ...
- Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数、ColModel API、事件及方法
系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...
- Java学习笔记10
31.编写当年龄age大于13且小于18时结果为true的布尔表达式age > 13 && age < 18 32.编写当体重weight大于50或身高大于160时结果为t ...
- [Unity3d]3D项目转换为VR项目(暴风魔镜SDK)
使用暴风魔镜SDK来操作 将魔镜的摄像头拖放到项目中: 将MoJingVrHead的Script剪切到CamRoot中: 这个时候能看到显示2个物体了,不过使用的Canvas还是显示一个: 调整Can ...
- mysql中文乱码解决方法
latin1(1和l的区别,l要么没有缺缺,要么缺缺是向左的直的; 1向左的缺缺是弯曲的,应该是可以看得出来的)是8位的字符集,表示英文和西欧字母. 瑞士: Switzerland [swits2la ...
- go智能提示(重要)
使用VIM开发go程序时,智能提示是一个大问题. 最终解决方案是使用 YCM,它是使用 gocode 来进行智能提示的.一切配置好之后,你会发现标准库和第三方库都可以智能提示,但自己写的包却不能,猜想 ...
- 搭建XMPP学习环境
XMPP(Extensible Messaging and Presence Protocol,前称Jabber)是一种以XML为基础的开放式IM协议.xmpp被人熟知,google talk肯定有一 ...
- C和指针 第九章 字符串 字符 字节
C语言中没有字符串类型,字符串是以NUL结尾的字符数组组成的. 高级字符串查找: //计算字符串起始部分,有多少字符是在group中 size_t strspn(char const * str, c ...