Table行合并操作

此方法不可取,但几天心血 保留,已有新想法,稍后会出一个完善的Table行列合并方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Table 行合并操作</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="../../js/CarCube/jquery-1.10.2.min.js"></script>
<style>
* { margin:0; padding:0; outline:0; background:transparent;}
table   { border-collapse:collapse; border-spacing:0; line-height:1.5; font-family:"微软雅黑"; font-size:14px; color:#666;}
.dn      { display:none;}

.bg_fec { background:#fec!important;}
.row_comb { cursor:pointer;}
.row_comb:hover { background:#EEF7FF!important;}

.tab_list    { border:1px solid #ccc; line-height:1.8;}
.tab_list th { padding:6px 10px; border:1px solid #ccc; background:#eee; text-align:center;}
.tab_list td { padding:6px 10px; border:1px solid #ccc; background:#f9f9f9; font-size:12px; font-family:"宋体"; text-align:center;}
.tab_list tr:nth-of-type(2n) td { background:#fefefe;}
</style>
</head>

<body style="width:auto; min-width:0;">
<br />

<script>
$(function(){

    $.tableMerger("#tab1");
});

$.tableMerger = function(tab){
    var tab     = $(tab),
        col_sum = getColSum(tab.find("tr").eq(0)); //列总数量

    if(col_sum === -1) {
        console.log("无法获取合并行数");
        return false;
    }

    //Get total columns table
    function getColSum(o){
        var sum = -1,
            tmp;
        if (typeof o == "object" && o.length > 0) {
            o   = o.children();
            sum = 0;
            for(var i=0; i<o.length; i++) {
                var tmp = o.eq(i).attr("colspan");
                if (!isNaN(tmp)) {
                    sum += tmp*1;
                } else {
                    ++sum;
                }
            }
        }
        return sum;
    }

    //Set data-colspan,data-rowspan value
    function childData() {
        var o   = tab.find("tr").children("[rowspan], [colspan]"),
            tmp = -1;

        for(var i=0; i<o.length; i++) {
            tmp = o.eq(i).attr("rowspan");
            if(!isNaN(tmp)) {
                o.eq(i).attr("data-rowspan", tmp);
            }
            tmp = o.eq(i).attr("colspan")
            if(!isNaN(tmp)) {
                o.eq(i).attr("data-colspan", tmp);
            }
        }
    }
    childData();

    tab.on("click", ".row_comb", function(){
        var self        = $(this),
            comb_sum    = self.attr("rowspan")*1,
            self_par    = self.parents("tr"),
            self_tr     = self_par.children(),
            tmp;

        //Set rowspan value, child : 表示一个td/th节点
        function setRowspanVal(child, isShow) {
            var rowspan_val = child.attr("rowspan") * 1;
            if (!isNaN(rowspan_val)) {
                if (isShow == 2) { //Parent node show
                    child.attr("rowspan", rowspan_val + comb_sum - 1);
                } else if(isShow == 1) { //Show
                    if (rowspan_val < comb_sum) {
                        child.attr("rowspan", child.attr("data-rowspan"));
                    } else {
                        child.attr("rowspan", rowspan_val + comb_sum - 1);
                    }
                } else if (isShow == 0) { //Hide
                    if (rowspan_val <= comb_sum) {
                        child.attr("rowspan", 1);
                    } else {
                        child.attr("rowspan", rowspan_val - comb_sum + 1);
                    }
                }
            }
        }

        if (comb_sum > 1) { //Hide merge row
            for(var i=self_par.index()+1; i<self_par.index() + self.attr("data-rowspan")*1; i++) { //Hide nodes under row
                tab.find("tr").eq(i).addClass("dn");
            }

            //self.data("child", self_par.children(":gt("+ self.index() +")")); //Save remove the row child
            for(var i=0; i<self_tr.length; i++) { //Set the row rowspan value
                setRowspanVal(self_tr.eq(i), 0);
                /*
                if(i > self.index()) { //Remove the row child
                    self_tr.eq(i).remove()
                }
                */
            }

            //Total replace
            /*
            var tot_tr = tab.find("tr").eq(self_par.index() + self.attr("data-rowspan")*1 - 1).clone().children();
            tot_tr.addClass("tab-mer-off");
            self_par.append(tot_tr);
            */

            if(self_tr.length < col_sum) { //Set parent node rowspan value
                var tr_o  = tab.find("tr"),
                    cur_tr_len;

                for(var n=0; n<col_sum - self_tr.length; n++) {
                    for(var i=self_par.index()-1; i>=0; i--) {
                        cur_tr_len = tr_o.eq(i).children().length;
                        if(cur_tr_len > self_tr.length + n) {
                            setRowspanVal(tr_o.eq(i).children().eq(cur_tr_len - self_tr.length - 1 - n), 0);
                            break;
                        }
                    }
                }
            }

        } else if (comb_sum == 1) { //Show merge row
            if(self.index() != 0 && self_tr.eq(self.index()-1).attr("rowspan") == 1) {
                alert("请先展开父级节点!")
                return false;
            }

            comb_sum = self.attr("data-rowspan") * 1; //Get Show row number

            for(var i=self_par.index()+1; i<self_par.index() + comb_sum; i++) { //Show nodes under row
                var cur_tr = tab.find("tr").eq(i).children("[rowspan]");
                tab.find("tr").eq(i).removeClass("dn");
                for(var n=0; n<cur_tr.length; n++) {
                    cur_tr.eq(n).attr("rowspan", cur_tr.eq(n).attr("data-rowspan")); //Reset the next node rowspan value
                }
            }

            for(var i=0; i<self_tr.length; i++) { //Set current row rowspan value
                setRowspanVal(self_tr.eq(i), 1);
            }

            /*
            var tmp_child = self.data("child");
            for(var i=0; i<tmp_child.length; i++) {
                tmp_child.eq(i).attr("rowspan", tmp_child.eq(i).attr("data-rowspan"));
                console.log("\n"+tmp_child.eq(i).attr("rowspan"))
            }
            */

            //Total replace
            /*
            self_par.find(".tab-mer-off").remove();
            self_par.append(tmp_child);
            */

            if(self_tr.length < col_sum) { //Set parent node rowspan value
                var tr_o  = tab.find("tr"),
                    cur_tr_len;

                for(var n=0; n<col_sum - self_tr.length; n++) {
                    for(var i=self_par.index()-1; i>=0; i--) {
                        cur_tr_len = tr_o.eq(i).children().length;
                        if(cur_tr_len > self_tr.length + n) {
                            setRowspanVal(tr_o.eq(i).children().eq(cur_tr_len - self_tr.length -1 - n), 2);
                            break;
                        }
                    }
                }
            }

        }

    });
}
</script>

<table id="tab1" class="tab_list" width="90%" style="margin:0 auto;">
    <tr>
        <td class="row_comb" rowspan="12">一级</td>
        <td class="row_comb" rowspan="6">二级</td>
        <td class="row_comb" rowspan="3">三级</td>
        <td>1</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>2</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>3</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td class="row_comb" rowspan="3">三级</td>
        <td>4</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>5</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>6</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td class="row_comb" rowspan="6">二级</td>
        <td class="row_comb" rowspan="3">三级</td>
        <td>7</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>8</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>9</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td class="row_comb" rowspan="3">三级</td>
        <td>10</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>11</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>12</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
</table>
<br />

</body>
</html>
时间: 2024-10-25 12:27:59

Table行合并操作的相关文章

Java利用poi生成word(包含插入图片,动态表格,行合并)

转: Java利用poi生成word(包含插入图片,动态表格,行合并) 2018年12月20日 09:06:51 wjw_11093010 阅读数:70 Java利用poi生成word(包含插入图片,动态表格,行合并) 测试模板样式: Word生成结果: 图表 2需要的jar包:(具体jar可自行去maven下载) 注意:需要严格按照上面版本下载jar包,否则可能出现jar包之间不能匹配的导致代码报错 各种 jar包都可以在这里下载: https://mvnrepository.com/ Tes

easyui datagrid行合并

easyui datagrid行合并 合并方法 /** * EasyUI DataGrid根据字段动态合并单元格 * 参数 tableID 要合并table的id * 参数 colList 要合并的列,用逗号分隔(例如:"name,department,office"); */ function mergeCellsByField(tableID, colList) { var ColArray = colList.split(","); var tTable =

Oracle 多行合并一行 方法

假如有如下表,其中各个i值对应的行数是不定的 Sql代码 SQL> select * from t; I A          D ---------- ---------- ------------------- 1 b          2008-03-27 10:55:42 1 a          2008-03-27 10:55:46 1 d          2008-03-27 10:55:30 2 z          2008-03-27 10:55:55 2 t       

通过SSIS的“查找”组件进行不同数据源之间数据的合并操作

原文:通过SSIS的"查找"组件进行不同数据源之间数据的合并操作 为了协助开发还原生产环境中的某些bug,需要将将生产环境的某些特定表数据导入到测试环境做测试,之前一直都是暴力地truncate测试环境的表,然后用SSIS将生产环境对应的整张表数据导入测试环境,简便快捷后来开发提出来,保留测试环境已有的数据,只同步差异的数据(根据主键),于是就尝试使用SSIS中的“查找”组件进行不同服务器之间的“存在则更新,不存在则插入”数据合并操作,实际操作的时候只执行插入操作,达到同步数据的目的.

基础数据结构-线性表-顺序表的合并操作

因为最近笔记本B面裂了准备去修,复杂些的会优先加上注释,所以在家先把代码和题目贴上来以后补文字,有疑问可以在下面留言. 顺序表的合并操作 题目描述建立顺序表的类,属性包括:数组.实际长度.最大长度(设定为1000) 已知两个递增序列,把两个序列的数据合并到顺序表中,并使得顺序表的数据递增有序输入第1行先输入n表示有n个数据,接着输入n个数据,表示第1个序列,要求数据递增互不等 第2行先输入m表示有m个数据,接着输入m个数据,表示第2个序列,要求数据递增互不等输出顺序表内容包括顺序表的实际长度和数

Table中合并相同内容列+Excel中合并相同内容列。

Table中合并相同内容列的方法比较好办,网上代码也很多,参照了一些把它封装成jquery 插件,调用起来还是蛮好用的. 这个地方稍微修改了下,有的时候td中内容虽然一样,但是数据库中的value却是不一样的,比如不同的公司,都有人事部,财务部, 公司A的财务部和公司B的财务部不能合并起来,所以我就给td加了个name属性.用于保存部门的ID,集团里面各公司部门ID总归不一样. 调用方式 $(function() {                            $("#tbdianba

行合并

[MSSQL] Row Merge, ?? Row ??? - ???? Row? ? ???? ? ??? ?? ??? ??? ?? 1. ???? view plaincopy to clipboardprint? CREATE  TABLE   #TEMP1 ( Code        INT, VALUE       VARCHAR(100) ) INSERT INTO #TEMP1 (Code,Value) VALUES ( 1, '??' ) INSERT INTO #TEMP1 

Mysql命令行常用操作

Mysql命令行常用操作 一.从命令行登录MySQL数据库服务器 1.登录使用默认3306端口的MySQL /usr/local/mysql/bin/mysql -u root -p 2.通过TCP连接管理不同端口的多个MySQL(注意:MySQL4.1以上版本才有此项功能) /usr/local/mysql/bin/mysql -u root -p --protocol=tcp --host=localhost --port=3307 3.通过socket套接字管理不同端口的多个MySQL /

alter table新增字段操作究竟有何影响?(上篇)

很久以前就有个疑问,见过一些表设计时会留出几个reverse的字段,目的是为了以后扩展,但此时设计的字段类型.长度等都是预计的,未来是否可用,不好说,那为什么会这么做呢?可能的原因是:"我现在设定好字段,需要的时候直接用就行了,不需要新增字段的操作". 那么,问题就是,新增字段的操作究竟有什么影响?增加表字段的时候,是否会锁表?对DML.DDL有什么影响?如果搞清楚这些,才能对上面的问题给出科学的答案. 为了证明增加字段的操作究竟做了什么,有什么影响,打算使用10046事件来看看. S