任务背景及需求

按页面上的现成表格,用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. 【原】javascript事件流

    摘要:事件流这个东西是比较重要的,为了让自己更加理解js中的事件流,必须整理整理,梳理一下事件流的各种东西啊.本文大部分内容参考<javascript高级程序设计第三版> 先来一段书里的原 ...

  2. 出现could not find developer disk image解决办法和不受信任的开发者

    真机测试问题 最近一直遇到这样的问题,很是让人心烦,但是还是要自己解决的,我也是从网上查了很多这样的解决办法,都没有成功,所以今天我要把自己的总结的方法和大家分享一下. iOS测试当中的问题 iOS ...

  3. HTML a标签、4个伪类、常用属性(下载)、锚链接(待扩展:邮件、电话、短信、GPS)

    HTML 超链接<a> 1.超链接可以是一个字.一个词.一组词.一幅图像,您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分. 2.当您把鼠标指针移动到网页中的某个链接上时,箭头会 ...

  4. 【迁移】—Entity Framework实例详解 转

    一.Entity Framework 迁移命令(get-help EntityFramework) Enable-Migrations 启用迁移 Add-Migration 为挂起的Model变化添加 ...

  5. UnknownHandler

    未知处理器 从struts2.1 开始 ,struts2配置文件的DTD中增加了<unknown-handler-stack…/>和<unknown-handler-ref…/> ...

  6. 移动端框架篇-控制子容器的滑屏框架-fullPage.js

    控制子容器法 方法是只显示其中一个子元素,其它隐藏,滑屏时隐藏当前元素,并显示当前元素的下一个同辈元素~ 这里采用fullPage框架,库大小7.69K~ fullPage框架的页面样式无需自定义,已 ...

  7. MySQL中find_in_set()和in的区别

    弄个测试表来说明两者的区别 CREATE TABLE `test` ( `id` int(8) NOT NULL auto_increment, `name` varchar(255) NOT NUL ...

  8. 关于requirejs

    24718-12042010 00001h6wzKLpfo3gmjJ8xoTPw5mQvY YA8vwka9tH!vibaUKS4FIDIkUfy!!f 3C"rQCIRbShpSlDcFT ...

  9. ecshop常用二次开发修改

    修改ecshop支付宝的支付按钮  http://www.68ecshop.com/article-1081.html 去掉ecshop收货人信息页面的电子邮件必填和电话.手机选填一个  http:/ ...

  10. c# 创建xml

    <?xml version="1.0" encoding="UTF-8"?> <swUpgrade xmlns="http://ww ...