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>

 

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