如何优雅的进行单元格合并

简介:

缘起

在前端开发过程中,大家想必都遇到过合并单元格的场景,那么你是怎么做的呢?欢迎分享, 这里分享我的方法供大家借鉴。 主要实现了2个方法 rowspan(colIdx) 和 copyRowspan (fromColIdx, toColIdx) 。rowspan 方法根据上下相邻的单元格内容相同则合并为一个。 copyRowspan 方法复制某列的合并规则。 一般这2个方法配合使用,可以完成比较复杂的单元格合并逻辑。
先上个效果图:
1532052245841-6e1deadb-0b9d-45b4-93d9-6629536945e1.png

如图示,完成了 第0、1、2、3、7列的合并。

效果图

下面代码是生成上图效果的的代码,代码相当简单:


$('#comboTable').on('draw.dt', function () {
    $(this).rowspan(0);  // 0列内单元格值相同会被合并
    $(this).copyRowspan(0, 1);  //复制0列的合并规则 到 1列
    $(this).copyRowspan(0, 2);
    $(this).copyRowspan(0, 3);
    $(this).copyRowspan(0, 7);

});

rowspan和copyRowspan是如何实现的呢?

直接上代码了,不再详述原理,有研究精神的同学可以看代码研究下,如果有bug欢迎留言反馈。 偷懒的同学可以复制黏贴了。



(function ($) {
    $.fn.extend({  //把如下2个方法,添加到jquery库中。
        "rowspan": function (colIdx) { //colIdx要合并的列序号,从0开始,  单元格中text(这个地方也可以改为html)相同则合并。 
            return this.each(function () {
                var that;
                $('tr', this).each(function (row) {
                    $('td:eq(' + colIdx + ')', this).filter(':visible').each(function (col) {
                        if (that != null && $(this).text() == $(that).text()) {
                            var rowspan = $(that).attr("rowSpan");
                            if (rowspan == undefined) {
                                $(that).attr("rowSpan", 1);
                                rowspan = $(that).attr("rowSpan");
                            }
                            rowspan = Number(rowspan) + 1;
                            $(that).attr("rowSpan", rowspan);
                            $(this).hide();
                        } else {
                            that = this;
                        }
                    });
                });
            });
        },
        "copyRowspan": function (fromColIdx, toColIdx) { //复制源列的单元格合并规则
            return this.each(function () {
                $('tr', this).each(function (row) {
                    var rowspan = $('td:eq(' + fromColIdx + ')', this).attr("rowSpan");
                    var style = $('td:eq(' + fromColIdx + ')', this).attr("style");

                    if (rowspan != undefined) {
                        $('td:eq(' + toColIdx + ')', this).attr("rowSpan", Number(rowspan));
                    }
                    if (style != undefined) {
                        $('td:eq(' + toColIdx + ')', this).attr("style", style);
                    }
                });
            });
        }
    });

})(jQuery);

目录
相关文章
|
敏捷开发 数据可视化 持续交付
带你读《SAFe 4.5参考指南:面向精益企业的规模化敏捷框架 》之一:SAFe基础
SAFe精益–敏捷领导者是终身学习者和老师,他们通过理解和展示精益–敏捷思维、SAFe原则和系统思考,帮助团队构建更好的系统。本书提供了一套在企业的投资组合、价值流、项目群和团队各个层面的完整的工作指南,包括构成框架的各种角色、活动和工件,以及价值观、理念、原则和实践的各种基本要素,并针对SAFe 4.5和SAFe 4.6进行了更新。
Vue3报错:Extraneous non-props attributes (style) were passed to component but could not be automatical
Vue3报错:Extraneous non-props attributes (style) were passed to component but could not be automatical
5062 1
|
缓存 前端开发 JavaScript
前端性能优化:从基础到进阶的实践指南
【10月更文挑战第4天】在前端开发中,性能优化至关重要,尤其随着Web应用的复杂化,用户对加载速度和响应性的要求日益提高。本文从基础知识入手,涵盖代码压缩、图片优化及缓存策略,并深入探讨代码拆分、懒加载和Web Workers等进阶技巧,帮助开发者全面提升Web应用的用户体验。通过这些方法,不仅能够减少页面加载时间,还能提升响应性和渲染性能,为用户提供更流畅的使用体验。
467 1
|
存储 缓存 NoSQL
由菜鸟到大神,谈谈redis的概念、实战、原理、高级使用方法
【5月更文挑战第18天】Redis是一个开源的内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串、哈希、列表、集合、有序集合等。
341 10
|
API
全国行政区划查询免费API接口教程
该接口提供全国(不含港澳台)各级行政区划查询服务,适用于地址填写、资料登记等场景。支持5级划分:省、市、区县、乡镇、村。请求需提供用户ID、KEY及查询级别等参数,返回地名列表或错误信息。 示例中ID和KEY为公共测试用,建议使用个人ID和KEY以享受更高调用频率。
3114 23
|
前端开发 JavaScript UED
什么是防抖和节流?有什么区别?如何实现?
防抖和节流是前端优化技术,用于限制函数的执行频率。防抖是在一段时间内只执行一次函数,常用于搜索输入、窗口调整等场景;节流是在固定时间间隔内执行函数,适用于滚动事件、鼠标移动等。实现方式通常使用定时器。
|
JavaScript
深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
447 0
|
容器
Vite项目当中的SVG图标的配置及图标全局组件的封装
Vite项目当中的SVG图标的配置及图标全局组件的封装
609 0
el-drawer抽屉组件弹窗遮挡问题解决
el-drawer抽屉组件弹窗遮挡问题解决
1103 3

热门文章

最新文章