js竖列合并单元格

本文介绍了一个JavaScript实现的合并单元格插件方法,通过fnMergeRowCell(arg0, arg1)函数,可以实现表格中指定列或前几列的竖向合并。示例中arg0参数为tbody元素,arg1参数支持两种写法:指定列合并如[0,1,2],或前几列合并如4。" 137509230,22955285,Docker部署Nginx实战:从基础镜像到配置管理,"['docker', 'nginx', '容器', '部署']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有一个合并单元格任务,需要写一个插件式的方法。马上上代码。

<!DOCTYPE html>
<html>

    <head>
        <script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
        <link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
        <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
        <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
    </head>
    <style>
        .center {
            vertical-align: middle !important;
        }
    </style>

    <body class="hastop body-pic body-wihte qjd_qjd">

        <div class="container">
            <div class="table-responsive">
                <table cellspacing="0" id="group-test" class="table table-small-font table-bordered table-striped">
                    <thead>
                        <tr>
                            <th data-priority="1">部门</th>
                            <th data-priority="1">区域</th>
                            <th data-priority="1">姓名</th>
                            <th data-priority="3">产品</th>
                            <th data-priority="3">销售额</th>
                        </tr>
                    </thead>

                    <tbody name="maintbody">
                        <tr>
                            <td>渠道业务部</td>
                            <td>华东区域</td>
                            <td>张三</td>
                            <td>奶粉A</td>
                            <td>6662990.12</td>
                        </tr>
                        <tr>
                            <td>渠道业务部</td>
                            <td>华东区域</td>
                            <td>张三</td>
                            <td>奶粉B</td>
                            <td>6662990.12</td>
                        </tr>
                        <tr>
                            <td>渠道业务部</td>
                            <td>华东区域</td>
                            <td>张三</td>
                            <td>奶粉C</td>
                            <td>6662990.12</td>
                        </tr>

                        <tr>
                            <td>渠道业务部</td>
                            <td>华北区域</td>
                            <td>王五</td>
                            <td>奶粉A</td>
                            <td>6662990.12</td>
                        </tr>
                        <tr>
                            <td>渠道业务部</td>
                            <td>华北区域</td>
                            <td>王五</td>
                            <td>奶粉B</td>
                            <td>6662990.12</td>
                        </tr>
                        <tr>
                            <td>渠道业务部</td>
                            <td>西北区域</td>
                            <td>王五</td>
                            <td>奶粉C</td>
                            <td>6662990.12</td>
                        </tr>

                        <tr>
                            <td>渠道业务部</td>
                            <td>西北区域</td>
                            <td>李四</td>
                            <td>奶粉A</td>
                            <td>6662990.12</td>
                        </tr>
                        <tr>
                            <td>渠道业务部</td>
                            <td>西北区域</td>
                            <td>李四</td>
                            <td>奶粉B</td>
                            <td>6662990.12</td>
                        </tr>
                        <tr>
                            <td>渠道业务部</td>
                            <td>华北区域</td>
                            <td>李四</td>
                            <td>奶粉C</td>
                            <td>6662990.12</td>
                        </tr>

                    </tbody>
                </table>
            </div>

        </div>
        <script type="application/javascript">
            var fnMergeRowCell = function(maintbodyObj, limitRowOrRowIndexs) {
                var limitRow = null //从0~n列
                var limitRowIndex = null; //具体限制某列,如[0,4,5]

                if(limitRowOrRowIndexs == undefined || limitRowOrRowIndexs == null) {
                    limitRow = null;
                    limitRowIndex = null;
                } else {
                    if($.isArray(limitRowOrRowIndexs)) {
                        limitRowIndex = limitRowOrRowIndexs;
                        limitRow = null;
                    } else {
                        limitRowIndex = null;
                        limitRow = limitRowOrRowIndexs;
                    }
                }

                /**
                 * 名称说明
                 * 1. 主合并对象:设置rowspan的td
                 * 2. 子合并对象:被隐藏的td
                 * 
                 * 实现原理
                 * 1. 每行扫描,拿当前行和下一行做对比,如果值为一致,标记为主合并对象(在标记前要判断是否为主标记对象,如果为子标记对对象进行data-ishide 标记 ),
                 * 2. 下一行自动标记上主合并对象的 data-pid
                 */

                var callAttr = "data-main";
                var dataPidKey = "data-cid";
                var $tbody = $(maintbodyObj);
                var trs = $tbody.find("tr");

                for(var i = 0; i < trs.length; i++) {
                    var $cr = $(trs[i]);
                    var $nr = $(trs[i + 1]);

                    var $crtd = $cr.find("td"); //当前行下面的td
                    var $nrtd = $nr.find("td"); //下一行下面的td

                    if(limitRow == null) {
                        limitRow = $crtd.length;
                    }

                    for(var r = 0; r < limitRow; r++) {
                        if(null != limitRowIndex) {
                            if(limitRowIndex.indexOf(r) == -1) {
                                continue;
                            }
                        }

                        var $crtdRow = $($crtd[r]);
                        var $nrtdRow = $($nrtd[r]);

                        //当前行对应的单元格的值 和 下一行对应的单元格的值相同
                        if($crtdRow.html() == $nrtdRow.html()) {

                            var dataId = $crtdRow.attr(dataPidKey);
                            //如果为隐藏,则代表着这个已经是被合并的了,需要拿到data-pid
                            if($crtdRow.attr(callAttr) != "false") {
                                dataId = "coordinate_" + i + "_" + r;
                                $crtdRow.attr(callAttr, "true").attr(dataPidKey, dataId); //标记主要主合并对象
                            }
                            $nrtdRow.attr(callAttr, "false").attr(dataPidKey, dataId);
                            $nrtdRow.hide();
                        }
                    }
                }

                $tbody.find("[" + callAttr + "=true]").each(function(i, _d) {
                    var dataPid = $(_d).attr(dataPidKey);
                    $(_d).attr("rowspan", $tbody.find("[" + dataPidKey + "=" + dataPid + "]").length).addClass("center");
                });
            }

            fnMergeRowCell($("[name=maintbody]"), [0, 1, 2]);
        </script>
    </body>

</html>

运行效果如下:
运行效果

fnMergeRowCell(arg0, arg1)
arg0:table 中的 tbody。
arg1:支持指定某列需要合并(写法:[0,1,2]),支持前几列需要合并(写法:4);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值