1. 程式人生 > >使用js多級次合併單元格

使用js多級次合併單元格

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  <title>表格相同內容合併</title> 
 </head> 
 <body>
   合併前: 
  <table width="400" border="1"> 
   <tbody>
    <tr> 
     <th>c1</th> 
     <th>c2</th> 
     <th>c3</th> 
     <th>c4</th> 
     <th>c5</th> 
     <th>c6</th> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>1</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
     <td>6</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>2</td> 
     <td>3</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>2</td> 
     <td>4</td> 
     <td>5</td> 
     <td>6</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>b</td> 
     <td>3</td> 
     <td>4</td> 
     <td>6</td> 
     <td>7</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>b</td> 
     <td>3</td> 
     <td>5</td> 
     <td>6</td> 
     <td>7</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>cc</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>cc</td> 
     <td>2</td> 
     <td>3</td> 
     <td>5</td> 
     <td>5</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>d</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>e</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
   </tbody>
  </table>
  <br /> 合併後:
  <br /> 
  <table width="400" border="1" id="table1"> 
   <tbody>
    <tr> 
     <th>c1</th> 
     <th>c2</th> 
     <th>c3</th> 
     <th>c4</th> 
     <th>c5</th> 
     <th>c6</th> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>1</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
     <td>6</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>2</td> 
     <td>3</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>2</td> 
     <td>4</td> 
     <td>5</td> 
     <td>6</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>b</td> 
     <td>3</td> 
     <td>4</td> 
     <td>6</td> 
     <td>7</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>b</td> 
     <td>3</td> 
     <td>5</td> 
     <td>6</td> 
     <td>7</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>cc</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>cc</td> 
     <td>2</td> 
     <td>3</td> 
     <td>5</td> 
     <td>5</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>d</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>e</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
   </tbody>
  </table>   
  <script type="text/javascript"> 
	//多級次動態合併表格行
	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;
		  console.info(rowCount);
		  var colCount = tb.rows[0].cells.length;
		  console.info(rowCount);
		  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 = [];
		  }
	}
	dynamicMergeTableRow('table1');
 </script> 
 </body>
</html>