多级次动态合并表格行
2016-09-08 18:56
375 查看
转自https://segmentfault.com/q/1010000004408330?_ea=597922
效果图:
//多级次动态合并表格行 function checkArray(arr1,arr2){ for (var i = 0; i < arr1.length; i++) { if (arr1[i].innerText===arr2[i].innerText) { }else{ return false; } } return true; } function dynamicMergeTableRow(tableId){ var tb = document.getElementById(tableId); var obj1; var obj2; var objtemp1 = []; var objtemp2 = []; var rowCount = tb.rows.length; var colCount = tb.rows[0].cells.length; var colLength = 4; //命名(表头除外) for (var i = 1; i < rowCount; i++) { for (var j = 0; j < colCount; j++) { tb.rows[i].cells[j].id = "tb_" + i.toString() + "_" + j.toString(); } } //从后往前检查,进行逐列检查合并,开始列为colLength-1 for (var col = colLength -1; col >= 0; col--) { //当col>0时有前方的单元格 if (col > 0) { //objtemp1为obj1左侧所有单元格集合,初始objtemp1及obj1均从第二行开始(tb_1_) for (var l = 0; l < col; l++) { objtemp1[l] = document.getElementById("tb_1_" + l.toString()); } } obj1 = document.getElementById("tb_1_" + col.toString()); //obj2为obj1下方单元格,obj1从第二行开始,则obj2从第三行开始,遍历以row=2为起始值 for (var row = 2; row < rowCount; row++) { //同obj1及objtemp1,col>0:即有前方单元格,此时有objtemp2 if (col > 0) { for (var l = 0; l < col; l++) { objtemp2[l] = document.getElementById("tb_" + row.toString() +"_"+ l.toString()); } } obj2 = document.getElementById("tb_" + row.toString() +"_"+ col.toString()); //定义完obj1/obj2/objtemp1/objtemp2后,开始合并 //第一层判断:当obj1的值等于obj2时,即同一列的相邻单元格值相同 if (obj1.innerText == obj2.innerText) { //第二层判断:obj1/obj2所在列前方还有其他列:即col>0(此步判断为单元格合并的依赖性提供支持) if (col > 0) { //第三层判断:obj1/obj2所在列前方还有其他列,且objtemp1,objtemp2值完全相同,可以合并 if (checkArray(objtemp1,objtemp2)) { obj1.rowSpan++; obj2.parentNode.removeChild(obj2); } //第三层判断:obj1/obj2所在列前方还有其他列,且objtemp1,objtemp2值不同,不可合并,并重新对obj1/objtemp1赋值,令其等于原来的obj2/objtemp2 else{ obj1 = document.getElementById("tb_" + row.toString() +"_"+ col.toString()); for (var l = 0; l < col; l++) { objtemp1[l] = document.getElementById("tb_" + row.toString() +"_"+ l.toString()); } } } //第二层判断:obj1/obj2所在列为首列,直接合并 else{ obj1.rowSpan++; obj2.parentNode.removeChild(obj2); } } //第一层判断:当obj1的值不等于obj2时,即同一列的相邻单元格值不相,此时重新对obj1/objtemp1赋值,令其等于原来的obj2/objtemp2 else{ obj1 = document.getElementById("tb_" + row.toString() +"_"+ col.toString()); for (var l = 0; l < col; l++) { objtemp1[l] = document.getElementById("tb_" + row.toString() +"_"+ l.toString()); } } } objtemp1 = []; objtemp2 = []; } }
效果图:
相关文章推荐
- Extjs4.0 最新最全视频教程
- Javascript中toFixed方法的改进
- 5个常见可用性错误和解决方案
- js数组实现图片轮播
- js可突破windows弹退效果代码
- JSP脚本漏洞面面观
- 使用BAT一句话命令实现快速合并JS、CSS
- js显示当前星期的起止日期的脚本
- 爆炸式的JS圆形浮动菜单特效代码
- js select常用操作控制代码
- JS实现不使用图片仿Windows右键菜单效果代码
- 从jsp发送动态图像
- 原生js结合html5制作小飞龙的简易跳球
- js 页面模块自由拖动实例
- js实现小鱼吐泡泡在页面游动特效
- 利用JS实现数字增长
- js 提交和设置表单的值
- PHP VBS JS 函数 对照表
- node.js抓取并分析网页内容有无特殊内容的js文件
- js+ajax处理java后台返回的json对象循环创建到表格的方法