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);

    }
});
时间: 2024-12-13 01:13:08

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

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

<script language="javascript" type="text/javascript"> $(function () { $("input[type=text]").keyup(function () { $(this).val($(this).val().toUpperCase()); }); }); </script> $("input[type=text]") 处可为文本框ID,

Copy_Excel_To_Excel#--此脚本用于将目标表格写入新的表格--

#--此脚本用于将目标表格写入新的表格-- #!/usr/bin/python3 # -*-coding:utf-8-*- #python读取Excel中单元格的内容返回的有5种类型ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error #显示单元格属性方法sheet.cell(row,col).ctype import xlrd import os from xlrd import xldate_as_tuple from

页面上有两个jqGrid表格时,冲突问题

如果一个页面上存在多个jqGrid,发现当刷新每一个表格的时候,其实都是第一个表格进行刷新. 当点击第二个表格分页的时候,第一个表格出现刷新,读取中..... 分析jqGrid源码发现: loadDiv = $("#load_"+$.jgrid.jqID(this.p.id)),  通过控制loadDiv 来控制读取中....的呈现状态.而针对loadDiv的选择器是跟jqgrid的id有关. 仔细分析出现这种问题的跟jqgrid对象对应的table有关: 1.未遵循ID选择器唯一性.

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

1.锚点跳转简介 Edit 锚点其实就是可以让页面定位到某个位置上的点.在高度较高的页面中经常见到.比如百度的百科页面,wiki中的page内容. 我知道实现锚点的跳转有两种形式,一种是a标签+name属性:还有一种就是使用标签的id属性.百度百科就是使用a标签的name属性来实现锚点跳转的. 比如: <a href="#2">波轮洗衣机介绍</a> <a name="2"></a> 但是上种方法使用了一个空标签,而且

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

Html 1 <body class="is-loading"> 2 <div class="curtain"> 3 <div class="loader"> 4 loading... 5 </div> 6 </div> 7 <div> 8 <!--这里 正文 --> 9 </div> 10 </body> Css 1 .loader {

使用文档对象在页面上创建学生信息表。 信息表包括学号、姓名、性别、电子邮件、联系电话、个人主页和联系地址, 信息表内容通过表单输入,提交前先使用正则表达式进行验证,联系地址不能超过20个字符, 每输入一名学生的信息,提交后,表格增加一行,表格不能被选择、复制。

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>    </head>    <!--        描述:使用文档对象在页面上创建学生信息表.        信息表包括学号.姓名.性别.电子邮件.联系电话.个人主页和联系地址,        信息表内容通过表单输入,提交前先使用

简单入门JavaScript库jQuery:用选择符创建jQuery对象并应用方法

jQuery,顾名思义,也就是JavaScript和查询(Query),是一个辅助JavaScript开发的库. jQuery 能极大地简化 JavaScript 编程. 目录1 jQuery库包含的特性2 jQuery与JS3 获取页面元素4 DOM事件与jQuery方法5 简易操作DOM元素6 处理尺寸7 遍历操作8 过滤操作9 jQuery对JS的增强10 为页面添加动态效果11 jQuery与Ajax12 jQuery工具 通过jQuery,您可以选取(查询,query) HTML元素,

(01)创建第一个jQuery Mobile页面

jQuery Mobile 是一个适配pc端和移动端的前台开放框架,当然很多时候主要用于移动端的开发.怎样搭建一个jQuery Mobile的开发环境呢?其实很简单,我们只需要引入的css.js和images等资源文件即可. 引入这些资源文件有两个方法: 1.从 CDN 中引入 jQuery Mobile 这个方法比较简单,你只需要引入css和js文件即可,不需要引入images文件,它们都已经存放在cdn服务器上了,当然这样不好的地方就是你不可以修改图片或者是js和css文件了. <!--jQ

如何在一个页面上让多个jQuery

如何在一个页面上让多个jQuery共存呢?比如jquery-1.5和jquery-1.11. 你可能会问,为什么需要在一个页面上让多个jQuery共存?直接引用最新版本的jQuery不行吗? 答案是,不行.因为现实生活是非常残酷的.举个栗子: 现有网站已经引用了jQuery 1.5以及相关插件.如果直接将jQuery升级到最新版,这些插件就不工作了,除非你能把这些插件全部升级,或者等各个插件的作者发布支持最新版jQuery的版本. 现在,如果我们要基于jQuery开发新的插件或者写JavaScr