layui 合并单元格

两盒软妹~` 提交于 2020-03-02 20:46:10
var layuiRowspan = function(fieldNameTmp, index, flag) {
   let fieldName = [];
   if (typeof fieldNameTmp == "string") {
      fieldName.push(fieldNameTmp);
   } else {
      fieldName = fieldName.concat(fieldNameTmp);
   }
   for (let i = 0; i < fieldName.length; i++) {
      execRowspan(fieldName[i], index, flag);
   }
}

var execRowspan = function(fieldName, index, flag) {
   // 1为不冻结的情况,左侧列为冻结的情况
   let fixedNode = index == "1" ? $(".layui-table-body")[index - 1] : (index == "3" ? $(".layui-table-fixed-r") : $(
      ".layui-table-fixed-l"));
   // 左侧导航栏不冻结的情况
   let child = $(fixedNode).find("td");
   let childFilterArr = [];
   // 获取data-field属性为fieldName的td
   for (let i = 0; i < child.length; i++) {
      if (child[i].getAttribute("data-field") == fieldName) {
         childFilterArr.push(child[i]);
      }
   }
   // 获取td的个数和种类
   let childFilterTextObj = {};
   for (let i = 0; i < childFilterArr.length; i++) {
      let childText = flag ? childFilterArr[i].innerHTML : childFilterArr[i].textContent;
      if (childFilterTextObj[childText] == undefined) {
         childFilterTextObj[childText] = 1;
      } else {
         let num = childFilterTextObj[childText];
         childFilterTextObj[childText] = num * 1 + 1;
      }
   }
   let canRowspan = true;
   let maxNum; //以前列单元格为基础获取的最大合并数
   let finalNextIndex; //获取其下第一个不合并单元格的index
   let finalNextKey; //获取其下第一个不合并单元格的值
   for (let i = 0; i < childFilterArr.length; i++) {
      (maxNum > 9000 || !maxNum) && (maxNum = $(childFilterArr[i]).prev().attr("rowspan") && fieldName != "8" ? $(
         childFilterArr[i]).prev().attr("rowspan") : 9999);
      let key = flag ? childFilterArr[i].innerHTML : childFilterArr[i].textContent; //获取下一个单元格的值
      let nextIndex = i + 1;
      let tdNum = childFilterTextObj[key];
      let curNum = maxNum < tdNum ? maxNum : tdNum;
      if (canRowspan) {
         for (let j = 1; j <= curNum && (i + j < childFilterArr.length);) { //循环获取最终合并数及finalNext的index和key
            finalNextKey = flag ? childFilterArr[i + j].innerHTML : childFilterArr[i + j].textContent;
            finalNextIndex = i + j;
            if ((key != finalNextKey && curNum > 1) || maxNum == j) {
               canRowspan = true;
               curNum = j;
               break;
            }
            j++;
            if ((i + j) == childFilterArr.length) {
               finalNextKey = undefined;
               finalNextIndex = i + j;
               break;
            }
         }
         childFilterArr[i].setAttribute("rowspan", curNum);
         if ($(childFilterArr[i]).find("div.rowspan").length > 0) { //设置td内的div.rowspan高度适应合并后的高度
            $(childFilterArr[i]).find("div.rowspan").parent("div.layui-table-cell").addClass("rowspanParent");
            $(childFilterArr[i]).find("div.layui-table-cell")[0].style.height = curNum * 38 - 10 + "px";
         }
         canRowspan = false;
      } else {
         childFilterArr[i].style.display = "none";
      }
      if (--childFilterTextObj[key] == 0 | --maxNum == 0 | --curNum == 0 | (finalNextKey != undefined && nextIndex ==
            finalNextIndex)) { //||(finalNextKey!=undefined&&key!=finalNextKey)
         canRowspan = true;
      }
   }
}

/*
   fieldName:用于定位相同的数据有多少行 
   elementId:要操作的table元素
   data-field
*/
function mergeCheckbox(fieldName, elementId) {
   var elementIndexList = new Array();

   //循环整个列表,创建每行数据的对象,并加入集合
   $.each($(elementId + ' .layui-table-body.layui-table-main .layui-table tbody tr'), function(i, obj) {
      /* 创建每行数据的对象 */
      var elementIndexObj = {
         "fieldName": "",
         "index": 0
      };
      /* 当前行字段的内容 */
      var fieldContent = $(obj).find("td[data-field=" + fieldName + "]").text().toString();
      
      /* 判断如果数组中没有存储任何行对象,则新增 */
      if (elementIndexList.length <= 0) {
         elementIndexObj["fieldName"] = $(obj).find("td[data-field=" + fieldName + "]").text().toString();
         /* 字段出现的次数 */
         elementIndexObj["index"]=$(this).index();
         elementIndexObj["ishave"]=true;
         /* 将对象加入集合 */
         elementIndexList.push(elementIndexObj);
      } else {
         //true 代表已存在 false 代表不存在
         var flag = false;
         var index; 
         for (var j = 0; j < elementIndexList.length; j++) {
            if(elementIndexList[j].fieldName == fieldContent){
               flag = true;
               index = j;
               break;
            }
         }
         
         if(flag){
            elementIndexObj["fieldName"] = $(obj).find("td[data-field=" + fieldName + "]").text().toString();
            /* 字段出现的次数 */
            elementIndexObj["index"]=$(this).index();
            elementIndexObj["ishave"]=false;
            /* 将对象加入集合 */
            elementIndexList.push(elementIndexObj);
         }else{
            elementIndexObj["fieldName"] = $(obj).find("td[data-field=" + fieldName + "]").text().toString();
            /* 字段出现的次数 */
            elementIndexObj["index"]=$(this).index();
            elementIndexObj["ishave"]=true;
            /* 将对象加入集合 */
            elementIndexList.push(elementIndexObj);
         }
      }
   });
   
   /* 改变每行的样式 */
   for(var g=0;g<elementIndexList.length;g++){
      /* 如果为true 则新增rowspan属性 */
      if(elementIndexList[g].ishave){
         var fieldValue = $(elementId + ' .layui-table-body.layui-table-main .layui-table tbody tr:eq('+elementIndexList[g].index+')').find("td:eq(0)").attr("rowspan","2");
      }else{
         var fieldValue = $(elementId + ' .layui-table-body.layui-table-main .layui-table tbody tr:eq('+elementIndexList[g].index+')').find("td:eq(0)").css("display","none");
      }
   }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!