1. 程式人生 > >table表格合併第一列中相同的內容(優化+註解)

table表格合併第一列中相同的內容(優化+註解)

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
   		
		#table1{border-collapse: collapse;}
		#table1	td{border: 1px solid #000;width: 50px;text-align: center;}
	</style>
	<script src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
	<script>
	console.log($("td").attr("rowSpan"));//所有td的rowSpan屬性的預設值都為undefined

	jQuery.fn.rowspan = function(colIdx) { //封裝的一個JQuery小外掛
		console.log(this);
	    return this.each(function(){ 
	    	console.log(this)
	        var that;//用來儲存含 有重複內容的列中的第一個td
			console.log(that);//undefined
			var r = 1;
	         $('tr').each(function() { //外層迴圈控制行
	            $('td:eq('+colIdx+')', this).each(function() { //內層迴圈控制列
	            	//第一次遇到if條件時 this為 #td01 顯然 undefined == “333”  結果為 false  進入else語句,把閉包中宣告的變數that設定為#td01,從此以後that的值恆為#td01
	            	//第二次遇到if條件時 this為 #td02 顯然 $(“#td01”).html() == $(“#td02”).html() 結果為 true 進入if語句,把#td01的rowSpan設定為2,並隱藏#td02
	            	//第三次遇到if條件時 this為 #td03 顯然 $(“#td01”).html() == $(“#td03”).html() 結果為 true 進入if語句,把#td01的rowSpan設定為3,並隱藏#td03
	            	// 過程:先執行1次else語句,再執行2次if語句
	               if ($(that).html() == $(this).html()) { 
	                  r++;//遍歷#td02,#td03,當遇到1個內容相等的td,rowspan=2;當遇到第2個內容相等的td,rowspan=3;......
	                  $(that).attr("rowSpan",r);//r自增1 然後賦值給#td01的rowSpan屬性
	                  console.log(that);//#td01
	                  $(this).hide(); //分別隱藏#td02,#td03
	                  console.log(this);//	#td02,#td03

	               } else {
	                  that = this;//#td01(#td02,#td03進不來)
	               }
	            });
	         });
	      });
	   }
	   
	   //呼叫jq裡面自定義的方法rowspan(colIdx)
	   $(document).on("DOMContentLoaded",function () { 
	    $("#table1").rowspan(0);//傳入的引數是對應的列數從0開始  第一列合併相同
	      // $("#table1").rowspan(2);//傳入的引數是對應的列數從0開始  第三列合併相同
	   })
	   
	</script>
</head>
<body>
	
	<table id="table1">
		<tr id="tr01">
			<td>111</td>
			<td>222</td>
			<td id="td01">333</td>
			<td></td>
		</tr>
		<tr>
			<td>111</td>
			<td>555</td>
			<td id="td02">333</td>
			<td></td>
		</tr>
		<tr>
			<td>111</td>
			<td>888</td>
			<td id="td03">333</td>
			<td></td>
		</tr>
		
	</table>


	
</html>

註解:
1、jQuery.fn是jQuery.prototype的簡寫,jq底層jQuery.fn = jQuery.prototype,即向jQuery物件的原型裡面新增方法。通過jQuery()或者$()新建的jq物件會自動繼承jQuery.prototype裡面的方法;
2、新新增的方法名為 rowspan(colIdx);一勞永逸! 新增一次,後面可以直接呼叫rowspan()方法,如$("#table1").rowspan(0);
3、整體結構f1>f2>f3>f4,4層函式巢狀,形成3個閉包,即閉包f2,f3,f4
閉包f2內部儲存的私有變數:colIdx
閉包f3內部儲存的私有變數:that 和 r
閉包f4內部儲存的私有變數:this (這裡的this指向當前td的執行環境context,即當前td所在的tr,而f4內部的this指向#td01,#td02,#td03,即重複列當中的每一個td)
4、this的指向:
函式f1內部的this指向:即將呼叫rowspan()方法的物件,如$("#table1").rowspan(0);this指向$("#table1")物件
函式f2內部的this指向:undified
函式f3內部的this指向:tr
函式f4內部的this指向:#td01,#td02,#td03,即重複列當中的每一個td
每句程式碼的註釋見上面的程式碼。








效果圖: