layui中列合并

一,冻结列,冻结行?

被冻结的列或行,不会随着滚动条的滑动而滚动。

二,js中var i={}与var i=[]的区别:

i={} 对象字变量 等同 i = new Object();
i=[] 数组字变量 等同 i = new Array();

参考:https://www.w3school.com.cn/js/js_objects.asp

 js中:对象基于Hash表存储变量------》变量声明顺序与存储顺序不一致 

 三,合并相同列:

参考:https://fly.layui.com/jie/27432/

思路:1,获取到所有的单元格(相同列的单元格data-firld值相同)------》2,遍历所有的单元格将data-firld相同(同一列)的单元格元素存储在数组中-----》3,定义一个:列中数据作为键的对象,统计一列中相同数据的个数作为值。------》遍历键值集合,对应看那列的所有单元格是否与键相同,相同-》设置这个单元格跨行数=集合键,如果有重复相同键的单元格就将这个单元格隐藏。

需要注意:

 

 改进:第一列的合并

思路: 第一列的思路同上面,用一个对象存储第一列那个合并行的对象(即知道了第一列合并情况,后面列就以这个为基准)eg[7,2]。------》获得存储需要合并列的所有单元格的对象,通过基准去确定需要遍历单元格对象的范围,在范围内遍历:确定在这个范围内单元格需要怎么合并,待所有的单元格遍历完,就确定了这列需要合并的情况eg:[2,5,2]<这一列需要先合并2行再5行再2行>----------》进行合并:又[2,5,2]为基准去确定遍历单元格的范围(eg:2------遍历0~1将0的行设置合并行为2,其他单元格就设置style.display = "none"。5--------遍历2~6将2的单元格设置合并5行,其他单元格设置style.display = "none"。。。。)

<script type="text/javascript">
/**
 * name layui合并tbody中单元格的方法
 * @param tableId  表格的id属性
 * @param fieldName 要合并的列field值
 * @desc 此方式适用于没有列冻结的单元格合并
 */
function tableRowSpanNoFixedCol(tableId, fieldName) {
    if (!tableId && !fieldName) {
        console.log('tableId, fieldName为必填项');
        return false;
    }
    // 获取页面中全部的表格元素
    var allTableNode = document.getElementsByClassName("layui-table-view");

    // 获取lay-id属性为tableId的表格元素的
    var targetTableNode = null;
    if (allTableNode.length > 0) {
        for (var index = 0, length = allTableNode.length; index < length; index++) {
            // 通过lay-id属性过滤表格元素
            var tableLayId = allTableNode[index].getAttribute("lay-id");
            if (tableLayId === tableId) {
                targetTableNode = allTableNode[index];
                break;
            }
        }
    }
    if (!targetTableNode) {
        console.log('没有找到ID为:' + tableId + '的表格, 请升级您的layui版本');
        return false;
    }

    // 开始合并单元格操作
    var tBodyNode = targetTableNode.getElementsByClassName("layui-table-body")[0];

    var tdNodes = tBodyNode.getElementsByTagName("td");//获得表格所有td--->单元格数
   
    var combinedata = {};//定义合并数
    for (var t = 0; t < fieldName.length; t++) {
       console.log("fieldName[t]=  "+fieldName[t]);
    	 var childFilterArr = [];
    	

    	// 获取data-field属性为fieldName的td
        for (var i = 0; i < tdNodes.length; i++) {
            if (tdNodes[i].getAttribute("data-field") === fieldName[t]) {//遍历每个td
                childFilterArr.push(tdNodes[i]);//将需要比较值的单元格放到数组中(即:将同一列的单元格放到数组中)
                
            }
        }
  
 
    // 获取td的个数和种类
    var childFilterTextObj = {};//定义对象变量
    var childFilterArrLength = childFilterArr.length;
    if(t ==0){
    	 for (var j = 0; j < childFilterArrLength; j++) {//统计一列中,定义值集合并确定相同值个数
    	        var childText = childFilterArr[j].textContent;//获取td的值
    	        if (childFilterTextObj[childText] === undefined) {//获取childFilterTextObj对象的[childText]属性
    	            childFilterTextObj[childText] = 1;
    	        } else {
    	            var num = childFilterTextObj[childText];
    	            childFilterTextObj[childText] = num * 1 + 1;
    	        }
    	    }
    	 combinedata = childFilterTextObj;
    	 

   	  // 给获取到的td设置合并单元格属性
   	    for (var key in childFilterTextObj) {//遍历对象:根据key键去遍历
   	        var tdNum = childFilterTextObj[key];
   	        var canRowSpan = true;
   	        var needChangeBackGroundNodes = [];
   	        var addEventNode = null;
   	        for (var h = 0; h < childFilterArrLength; h++) {
   	            if (childFilterArr[h].textContent === key) {
   	                needChangeBackGroundNodes.push(childFilterArr[h]);
   	                if (canRowSpan) {
   	                    childFilterArr[h].setAttribute("rowspan", tdNum);
   	                    addEventNode = childFilterArr[h];
   	                    canRowSpan = false;
   	                } else {
   	                    childFilterArr[h].style.display = "none";
   	                }
   	            }
   	        }
   	/*
   	        // 以下为单元格鼠标悬浮样式修改(使用闭包)
   	        (function (addEventNode, needChangeBackGroundNodes) {
   	            addEventNode.onmouseover = function () {
   	                for (var index = 0, length = needChangeBackGroundNodes.length; index < length; index++) {
   	                    needChangeBackGroundNodes[index].parentNode.style.background = "#f2f2f2"; // 我这里的单元格鼠标滑过背景色为layui默认,你可以更改为你想要的颜色。
   	                }
   	            };
   	            addEventNode.onmouseout = function () {
   	                for (var index = 0, length = needChangeBackGroundNodes.length; index < length; index++) {
   	                    needChangeBackGroundNodes[index].parentNode.style.background = "";
   	                }
   	            };
   	        })(addEventNode, needChangeBackGroundNodes);*/
   	    }
   	 
    }else{
    	console.log("       ~~~~~~~~~~~~~~"+t);
    	console.log("       ~~~~~~~~~~~~~~"+JSON.stringify(combinedata));
    	 var sum =0;
   	  	var h =0;
   		var data =[];
    	  for (var key in combinedata) {//以第一列的合并情况为标准
    		  var temporary ={};
    		  sum += combinedata[key];
    		  for(;h<sum;h++){
    			  
    			  var childText = childFilterArr[h].textContent;//获取td的值
    			  if (temporary[childText] === undefined) {//获取childFilterTextObj对象的[childText]属性
    				  temporary[childText] = 1;
        	        } else {
        	            var num = temporary[childText];
        	            temporary[childText] = num * 1 + 1;
        	        }
      	       
      	    }
    		  
    		  for( var key in temporary){
    			  data.push(temporary[key]);
    			  console.log(key+"  : "+temporary[key]);
    		  }
    		  
    		  }
    	  console.log("       ~~~~~~~~~~~~~~"+JSON.stringify(data));
    	   sum =0;
    	 	h =0;
    	 	
    	 	for( var s=0;s<data.length;s++){
    	 		sum += data[s];
    	 		 var canRowSpan = true;
      	    	 for (; h < sum; h++) {
      	    		 
      	    			 if (canRowSpan) {
       	                    childFilterArr[h].setAttribute("rowspan", data[s]);
       	                    canRowSpan = false;
       	                } else {
       	                    childFilterArr[h].style.display = "none";
       	                }
      	    		
      	    	 }
    	 	}

    	  
    		  
    	  }
    

    
    	 
    
   
  
    }
}




</script>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章