javascript学习笔记(十一)对表格进行排序(包括数值、字符串、日期等数据类型)

在javascript学习笔记(十)中,我们对表格进行了一些美化,主要是实现隔行换色及鼠标经过时高亮两个功能!这样看起来,感觉已经不错了,用户体验要比之前好多了。
在今天的学习笔记中,我们对表格再改进一些,让用户体验再好一些。我们先看下图:
图1 会员信息表
比如我们现在有图1这样一个表格,在会员组这一列中,需要把相同会员组的排在一起,这样就需要对这个表格进行一些排序的操作。下面我们就来一步一步实现这个需求:
基本原理:首先提取会员组这列的值,然后存储在一个数组中,然后利用arrayObject.sort()方法对其排序,排序的结果先保存在一个临时的代码片段中(documentFragment),最后把新的排序结果替换掉之前的单元格,最终实现排序的功能。
javascript部分代码:
	//用于sort排序的比较函数
	function compareTrs(tr1, tr2) {
		var value1 = tr1.cells[3].innerHTML;
		var value2 = tr2.cells[3].innerHTML;
		//var value1 = tr1.cells[3].firstChild.nodeValue; //两种方式都可以取得表格中单元格的值
		//var value2 = tr2.cells[3].firstChild.nodeValue;
		return value1.localeCompare(value2);
	}
	
	//对表格进行排序
	function sortTable(tableId) {
		var table = document.getElementById(tableId);
		var tbody = table.tBodies[0];
		var tr = tbody.rows; 

		var trValue = new Array();
		for (var i=0; i<tr.length; i++ ) {
			trValue[i] = tr[i];  //将表格中各行的信息存储在新建的数组中
		}

		trValue.sort(compareTrs);  //进行排序

		var fragment = document.createDocumentFragment();  //新建一个代码片段,用于保存排序后的结果
		for (var i=0; i<trValue.length; i++ ) {
			fragment.appendChild(trValue[i]);
		}

		tbody.appendChild(fragment); //将排序的结果替换掉之前的值
	}
 然后我们在html代码中添加动作事件:
	<table summary="user infomation table" id="tableSort">
		<thead>
			<tr>
				<th>会员ID</th>
				<th>会员名</th>
				<th>邮箱</th>
				<th onclick="sortTable('tableSort')" style="cursor: pointer;">会员组</th>
				<th>城市</th>
				<th>注册时间</th>
			</tr>
		</thead>
		<tbody>
			……
		</tbody>
	</table>
 请看完整示例1:
<!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 content="text/html; charset=UTF-8" http-equiv="Content-Type">
<title>sort table -- by zhangchen</title>
<style type="text/css">
	* {
		padding:0;
		margin:0;
	}

	body {
		font-family:verdana;
		font-size:12px;
	}

	.content {
		width:550px;
		margin:20px auto;
	}

	.content h1 {
		font-family:'微软雅黑';
		font-size:18px;
		padding-bottom:5px;
	}

	table {
		width:100%;
	}

	th, td {
		padding:6px 0;
		text-align:center;
	}

	th {
		background-color:#007D28;
		color:#ffffff;
	}
	
	tr {
		background-color:#E8FFE8;
	}
	
	.odd {
		background-color:#FFF3EE;
	}
	
	.highlight {
		background-color:#FFF3EE;
}

</style>

<script type="text/javascript">

	//动态给js添加class属性
	function addClass(element, value) {
		if(!element.className) {
			element.className = value; //如果element本身不存在class,则直接添加class为value的值
		} else {
			element.className += " "+value; //如果element之前有一个class值,注意中间要多一个空格,然后再加上value的值
		}
	}
	
	//鼠标经过时高亮显示
	function highlightRows() {
		var rows = document.getElementsByTagName("tr");
		for(var i=0; i<rows.length; i++) {
			rows[i].oldClassName = rows[i].className; //首先保存之前的class值
			rows[i].onmouseover = function() {
				addClass(this, "highlight"); //鼠标经过时添加class为highlight的值
			}
			rows[i].onmouseout = function() {
				this.className = this.oldClassName; //鼠标离开时还原之前的class值
			}
		}
	}

	//用于sort排序的比较函数
	function compareTrs(tr1, tr2) {
		var value1 = tr1.cells[3].innerHTML;
		var value2 = tr2.cells[3].innerHTML;
		//var value1 = tr1.cells[3].firstChild.nodeValue; //两种方式都可以表格中单元格的值
		//var value2 = tr2.cells[3].firstChild.nodeValue;
		return value1.localeCompare(value2);
	}

	//对表格进行排序
	function sortTable(tableId) {
		var table = document.getElementById(tableId);
		var tbody = table.tBodies[0];
		var tr = tbody.rows; 

		var trValue = new Array();
		for (var i=0; i<tr.length; i++ ) {
			trValue[i] = tr[i];  //将表格中各行的信息存储在新建的数组中
		}

		trValue.sort(compareTrs);  //进行排序

		var fragment = document.createDocumentFragment();  //新建一个代码片段,用于保存排序后的结果
		for (var i=0; i<trValue.length; i++ ) {
			fragment.appendChild(trValue[i]);
		}

		tbody.appendChild(fragment); //将排序的结果替换掉之前的值
	}

	window.onload = function() {
		highlightRows();
	}
</script>
</head>

<body>
<div class="content">
	<h1>会员信息表(点击表格标题可进行排序)</h1>
	<table summary="user infomation table" id="tableSort">
		<thead>
			<tr>
				<th>会员ID</th>
				<th>会员名</th>
				<th>邮箱</th>
				<th onclick="sortTable('tableSort')" style="cursor: pointer;">会员组</th>
				<th>城市</th>
				<th>注册时间</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>126</td>
				<td>webw3c</td>
				<td>este@126.com</td>
				<td>普通会员</td>
				<td>北京</td>
				<td>2011-04-13</td>
			</tr>
			<tr>
				<td>145</td>
				<td>test001</td>
				<td>test001@126.com</td>
				<td>中级会员</td>
				<td>合肥</td>
				<td>2011-03-27</td>
			</tr>
			<tr>
				<td>116</td>
				<td>wuliao</td>
				<td>wuliao@126.com</td>
				<td>普通会员</td>
				<td>南昌</td>
				<td>2011-04-01</td>
			</tr>
			<tr>
				<td>129</td>
				<td>tired</td>
				<td>tired@126.com</td>
				<td>中级会员</td>
				<td>北京</td>
				<td>2011-04-06</td>
			</tr>
			<tr>
				<td>155</td>
				<td>tiredso</td>
				<td>tireds0@126.com</td>
				<td>中级会员</td>
				<td>武汉</td>
				<td>2011-04-06</td>
			</tr>
			<tr>
				<td>131</td>
				<td>javascript</td>
				<td>js2011@126.com</td>
				<td>中级会员</td>
				<td>武汉</td>
				<td>2011-04-08</td>
			</tr>
			<tr>
				<td>132</td>
				<td>jQuery</td>
				<td>jQuery@126.com</td>
				<td>高级会员</td>
				<td>北京</td>
				<td>2011-04-12</td>
			</tr>
		</tbody>
	</table>
</div>

</body>
</html>
在示例1中,当我们点击表格标题中的会员组时,已经进行了排序。正是我们需要的!
但是这个还不是最好的,用户只能点击排序一次,而且是正序,如果我们要反序排呢?我们再来对sortTable()函数进行改进!
	//对表格进行排序
	function sortTable(tableId) {
		var table = document.getElementById(tableId);
		var tbody = table.tBodies[0];
		var tr = tbody.rows; 

		var trValue = new Array();
		for (var i=0; i<tr.length; i++ ) {
			trValue[i] = tr[i];  //将表格中各行的信息存储在新建的数组中
		}

		if (tbody.sortCol == 3) {
			trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列
		} else {
			trValue.sort(compareTrs);  //进行排序
		}

		var fragment = document.createDocumentFragment();  //新建一个代码片段,用于保存排序后的结果
		for (var i=0; i<trValue.length; i++ ) {
			fragment.appendChild(trValue[i]);
		}

		tbody.appendChild(fragment); //将排序的结果替换掉之前的值
		tbody.sortCol = 3;
	}
当对会员组这列首次排序后,我们再次点击表格标题中的会员组时,直接对其该列逆序排列,用户体验又加强了。
请看完整示例2:
<!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 content="text/html; charset=UTF-8" http-equiv="Content-Type">
<title>sort table -- by zhangchen</title>
<style type="text/css">
	* {
		padding:0;
		margin:0;
	}

	body {
		font-family:verdana;
		font-size:12px;
	}

	.content {
		width:550px;
		margin:20px auto;
	}

	.content h1 {
		font-family:'微软雅黑';
		font-size:18px;
		padding-bottom:5px;
	}

	table {
		width:100%;
	}

	th, td {
		padding:6px 0;
		text-align:center;
	}

	th {
		background-color:#007D28;
		color:#ffffff;
	}
	
	tr {
		background-color:#E8FFE8;
	}
	
	.odd {
		background-color:#FFF3EE;
	}
	
	.highlight {
		background-color:#FFF3EE;
}

</style>

<script type="text/javascript">

	//动态给js添加class属性
	function addClass(element, value) {
		if(!element.className) {
			element.className = value; //如果element本身不存在class,则直接添加class为value的值
		} else {
			element.className += " "+value; //如果element之前有一个class值,注意中间要多一个空格,然后再加上value的值
		}
	}
	
	//鼠标经过时高亮显示
	function highlightRows() {
		var rows = document.getElementsByTagName("tr");
		for(var i=0; i<rows.length; i++) {
			rows[i].oldClassName = rows[i].className; //首先保存之前的class值
			rows[i].onmouseover = function() {
				addClass(this, "highlight"); //鼠标经过时添加class为highlight的值
			}
			rows[i].onmouseout = function() {
				this.className = this.oldClassName; //鼠标离开时还原之前的class值
			}
		}
	}

	//用于sort排序的比较函数
	function compareTrs(tr1, tr2) {
		var value1 = tr1.cells[3].innerHTML;
		var value2 = tr2.cells[3].innerHTML;
		//var value1 = tr1.cells[3].firstChild.nodeValue; //两种方式都可以表格中单元格的值
		//var value2 = tr2.cells[3].firstChild.nodeValue;
		return value1.localeCompare(value2);
	}

	//对表格进行排序
	function sortTable(tableId) {
		var table = document.getElementById(tableId);
		var tbody = table.tBodies[0];
		var tr = tbody.rows; 

		var trValue = new Array();
		for (var i=0; i<tr.length; i++ ) {
			trValue[i] = tr[i];  //将表格中各行的信息存储在新建的数组中
		}

		if (tbody.sortCol == 3) {
			trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列
		} else {
			trValue.sort(compareTrs);  //进行排序
		}

		var fragment = document.createDocumentFragment();  //新建一个代码片段,用于保存排序后的结果
		for (var i=0; i<trValue.length; i++ ) {
			fragment.appendChild(trValue[i]);
		}

		tbody.appendChild(fragment); //将排序的结果替换掉之前的值
		tbody.sortCol = 3;
	}

	window.onload = function() {
		highlightRows();
	}
</script>
</head>

<body>
<div class="content">
	<h1>会员信息表(点击表格标题可进行排序)</h1>
	<table summary="user infomation table" id="tableSort">
		<thead>
			<tr>
				<th>会员ID</th>
				<th>会员名</th>
				<th>邮箱</th>
				<th onclick="sortTable('tableSort')" style="cursor: pointer;">会员组</th>
				<th>城市</th>
				<th>注册时间</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>126</td>
				<td>webw3c</td>
				<td>este@126.com</td>
				<td>普通会员</td>
				<td>北京</td>
				<td>2011-04-13</td>
			</tr>
			<tr>
				<td>145</td>
				<td>test001</td>
				<td>test001@126.com</td>
				<td>中级会员</td>
				<td>合肥</td>
				<td>2011-03-27</td>
			</tr>
			<tr>
				<td>116</td>
				<td>wuliao</td>
				<td>wuliao@126.com</td>
				<td>普通会员</td>
				<td>南昌</td>
				<td>2011-04-01</td>
			</tr>
			<tr>
				<td>129</td>
				<td>tired</td>
				<td>tired@126.com</td>
				<td>中级会员</td>
				<td>北京</td>
				<td>2011-04-06</td>
			</tr>
			<tr>
				<td>155</td>
				<td>tiredso</td>
				<td>tireds0@126.com</td>
				<td>中级会员</td>
				<td>武汉</td>
				<td>2011-04-06</td>
			</tr>
			<tr>
				<td>131</td>
				<td>javascript</td>
				<td>js2011@126.com</td>
				<td>中级会员</td>
				<td>武汉</td>
				<td>2011-04-08</td>
			</tr>
			<tr>
				<td>132</td>
				<td>jQuery</td>
				<td>jQuery@126.com</td>
				<td>高级会员</td>
				<td>北京</td>
				<td>2011-04-12</td>
			</tr>
		</tbody>
	</table>
</div>

</body>
</html>
示例2中只是对指定的列进行了排序,现在我们又需要对其它的列也进行同样的排序,那怎么做呢?我们可以把需要排序的列作为一个参数给sortTable()函数。请看更改后的js:
	//用于sort排序的比较函数
	function compareCols(col) {  //直接将compareTrs()函数作为compareCols()的返回值
	return function compareTrs(tr1, tr2) {
			//var value1 = tr1.cells[col].innerHTML;
			//var value2 = tr2.cells[col].innerHTML;
			var value1 = tr1.cells[col].firstChild.nodeValue; //两种方式都可以取得表格中单元格的值
			var value2 = tr2.cells[col].firstChild.nodeValue;
			return value1.localeCompare(value2);
		};
	}


	//对表格进行排序
	function sortTable(tableId, col) {
		var table = document.getElementById(tableId);
		var tbody = table.tBodies[0];
		var tr = tbody.rows; 

		var trValue = new Array();
		for (var i=0; i<tr.length; i++ ) {
			trValue[i] = tr[i];  //将表格中各行的信息存储在新建的数组中
		}

		if (tbody.sortCol == col) {
			trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列
		} else {
			trValue.sort(compareCols(col));  //进行排序
		}

		var fragment = document.createDocumentFragment();  //新建一个代码片段,用于保存排序后的结果
		for (var i=0; i<trValue.length; i++ ) {
			fragment.appendChild(trValue[i]);
		}

		tbody.appendChild(fragment); //将排序的结果替换掉之前的值
		tbody.sortCol = col;
	}
更改后的html代码:
	<table summary="user infomation table" id="tableSort">
		<thead>
			<tr>
				<th>会员ID</th>
				<th onclick="sortTable('tableSort', 1)" style="cursor: pointer;">会员名</th>
				<th onclick="sortTable('tableSort', 2)" style="cursor: pointer;">邮箱</th>
				<th onclick="sortTable('tableSort', 3)" style="cursor: pointer;">会员组</th>
				<th onclick="sortTable('tableSort', 4)" style="cursor: pointer;">城市</th>
				<th>注册时间</th>
			</tr>
		</thead>
		<tbody>
			……
		</tbody>
	</table>
请注意compareCols()函数,它直接将compareTrs()函数作为它的返回值,我们知道用于sort比较的函数是没有第三个参数的,所以这里将compareTrs()作为compareCols()的返回值。这样我们就可以把需要排序的列作为参数传递到sortTable()中了,这样就全部参数化了。
请看完整示例3:
<!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 content="text/html; charset=UTF-8" http-equiv="Content-Type">
<title>sort table -- by zhangchen</title>
<style type="text/css">
	* {
		padding:0;
		margin:0;
	}

	body {
		font-family:verdana;
		font-size:12px;
	}

	.content {
		width:550px;
		margin:20px auto;
	}

	.content h1 {
		font-family:'微软雅黑';
		font-size:18px;
		padding-bottom:5px;
	}

	table {
		width:100%;
	}

	th, td {
		padding:6px 0;
		text-align:center;
	}

	th {
		background-color:#007D28;
		color:#ffffff;
	}
	
	tr {
		background-color:#E8FFE8;
	}
	
	.odd {
		background-color:#FFF3EE;
	}
	
	.highlight {
		background-color:#FFF3EE;
}

</style>

<script type="text/javascript">

	//动态给js添加class属性
	function addClass(element, value) {
		if(!element.className) {
			element.className = value; //如果element本身不存在class,则直接添加class为value的值
		} else {
			element.className += " "+value; //如果element之前有一个class值,注意中间要多一个空格,然后再加上value的值
		}
	}
	
	//鼠标经过时高亮显示
	function highlightRows() {
		var rows = document.getElementsByTagName("tr");
		for(var i=0; i<rows.length; i++) {
			rows[i].oldClassName = rows[i].className; //首先保存之前的class值
			rows[i].onmouseover = function() {
				addClass(this, "highlight"); //鼠标经过时添加class为highlight的值
			}
			rows[i].onmouseout = function() {
				this.className = this.oldClassName; //鼠标离开时还原之前的class值
			}
		}
	}

	//用于sort排序的比较函数
	function compareCols(col) {  //直接将compareTrs()函数作为compareCols()的返回值
	return function compareTrs(tr1, tr2) {
			//var value1 = tr1.cells[col].innerHTML;
			//var value2 = tr2.cells[col].innerHTML;
			var value1 = tr1.cells[col].firstChild.nodeValue; //两种方式都可以取得表格中单元格的值
			var value2 = tr2.cells[col].firstChild.nodeValue;
			return value1.localeCompare(value2);
		};
	}

	//对表格进行排序
	function sortTable(tableId, col) {
		var table = document.getElementById(tableId);
		var tbody = table.tBodies[0];
		var tr = tbody.rows; 

		var trValue = new Array();
		for (var i=0; i<tr.length; i++ ) {
			trValue[i] = tr[i];  //将表格中各行的信息存储在新建的数组中
		}

		if (tbody.sortCol == col) {
			trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列
		} else {
			trValue.sort(compareCols(col));  //进行排序
		}

		var fragment = document.createDocumentFragment();  //新建一个代码片段,用于保存排序后的结果
		for (var i=0; i<trValue.length; i++ ) {
			fragment.appendChild(trValue[i]);
		}

		tbody.appendChild(fragment); //将排序的结果替换掉之前的值
		tbody.sortCol = col;
	}

	window.onload = function() {
		highlightRows();
	}
</script>
</head>

<body>
<div class="content">
	<h1>会员信息表(点击表格标题可进行排序)</h1>
	<table summary="user infomation table" id="tableSort">
		<thead>
			<tr>
				<th>会员ID</th>
				<th onclick="sortTable('tableSort', 1)" style="cursor: pointer;">会员名</th>
				<th onclick="sortTable('tableSort', 2)" style="cursor: pointer;">邮箱</th>
				<th onclick="sortTable('tableSort', 3)" style="cursor: pointer;">会员组</th>
				<th onclick="sortTable('tableSort', 4)" style="cursor: pointer;">城市</th>
				<th>注册时间</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>126</td>
				<td>webw3c</td>
				<td>este@126.com</td>
				<td>普通会员</td>
				<td>北京</td>
				<td>2011-04-13</td>
			</tr>
			<tr>
				<td>145</td>
				<td>test001</td>
				<td>test001@126.com</td>
				<td>中级会员</td>
				<td>合肥</td>
				<td>2011-03-27</td>
			</tr>
			<tr>
				<td>116</td>
				<td>wuliao</td>
				<td>wuliao@126.com</td>
				<td>普通会员</td>
				<td>南昌</td>
				<td>2011-04-01</td>
			</tr>
			<tr>
				<td>129</td>
				<td>tired</td>
				<td>tired@126.com</td>
				<td>中级会员</td>
				<td>北京</td>
				<td>2011-04-06</td>
			</tr>
			<tr>
				<td>155</td>
				<td>tiredso</td>
				<td>tireds0@126.com</td>
				<td>中级会员</td>
				<td>武汉</td>
				<td>2011-04-06</td>
			</tr>
			<tr>
				<td>131</td>
				<td>javascript</td>
				<td>js2011@126.com</td>
				<td>中级会员</td>
				<td>武汉</td>
				<td>2011-04-08</td>
			</tr>
			<tr>
				<td>132</td>
				<td>jQuery</td>
				<td>jQuery@126.com</td>
				<td>高级会员</td>
				<td>北京</td>
				<td>2011-04-12</td>
			</tr>
		</tbody>
	</table>
</div>

</body>
</html>
 示例3中,我们已经完成了多列的排序,但是这些仅仅只能针对字符串的列进行排序,如果现在又要按照会员ID和注册时间进行排序呢?这里我们就需要对排序函数compareCols()进行修改,在进行比较之前,我们需要对字符串按照数据类型进行转换,所以我们新增了convert()函数,请看修改后的js代码:
	//比较之前进行数据转换
	function convert(value, dataType) {
		switch(dataType) {
			case "int":
				return parseInt(value);
				break
			case "float":
				return parseFloat(value);
				break
			case "date":
				return Date.parse(value);
				break
			default:
				return value.toString();
		}
	}

	//用于sort比较字符串
	function compareCols(col, dataType) {
		return function compareTrs(tr1, tr2) {
			value1 = convert(tr1.cells[col].innerHTML, dataType);
			value2 = convert(tr2.cells[col].innerHTML, dataType);
			if (value1 < value2) {
				return -1;
			} else if (value1 > value2) {
				return 1;
			} else {
				return 0;
			}
		};
	}

	//对表格进行排序
	function sortTable(tableId, col, dataType) {
		var table = document.getElementById(tableId);
		var tbody = table.tBodies[0];
		var tr = tbody.rows; 

		var trValue = new Array();
		for (var i=0; i<tr.length; i++ ) {
			trValue[i] = tr[i];  //将表格中各行的信息存储在新建的数组中
		}

		if (tbody.sortCol == col) {
			trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列
		} else {
			trValue.sort(compareCols(col, dataType));  //进行排序
		}

		var fragment = document.createDocumentFragment();  //新建一个代码片段,用于保存排序后的结果
		for (var i=0; i<trValue.length; i++ ) {
			fragment.appendChild(trValue[i]);
		}

		tbody.appendChild(fragment); //将排序的结果替换掉之前的值
		tbody.sortCol = col;
	}
在html中调用:
	<table summary="user infomation table" id="tableSort">
		<thead>
			<tr>
				<th onclick="sortTable('tableSort', 0, 'int')" style="cursor: pointer;">会员ID</th>
				<th onclick="sortTable('tableSort', 1)" style="cursor: pointer;">会员名</th>
				<th onclick="sortTable('tableSort', 2)" style="cursor: pointer;">邮箱</th>
				<th onclick="sortTable('tableSort', 3)" style="cursor: pointer;">会员组</th>
				<th onclick="sortTable('tableSort', 4)" style="cursor: pointer;">城市</th>
				<th onclick="sortTable('tableSort', 5, 'date')" style="cursor: pointer;">注册时间</th>
			</tr>
		</thead>
		<tbody>
			……
		</tbody>
	</table>
经过我们的改进,已经可以满足我们的所有需要了,我们可能对数值,日期,字符串各类型的数据进行排序了。
 
请看完整代码示例:
<!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 content="text/html; charset=UTF-8" http-equiv="Content-Type">
<title>sort table -- by zhangchen</title>
<style type="text/css">
	* {
		padding:0;
		margin:0;
	}

	body {
		font-family:verdana;
		font-size:12px;
	}

	.content {
		width:550px;
		margin:20px auto;
	}

	.content h1 {
		font-family:'微软雅黑';
		font-size:18px;
		padding-bottom:5px;
	}

	table {
		width:100%;
	}

	th, td {
		padding:6px 0;
		text-align:center;
	}

	th {
		background-color:#007D28;
		color:#ffffff;
	}
	
	tr {
		background-color:#E8FFE8;
	}
	
	.odd {
		background-color:#FFF3EE;
	}
	
	.highlight {
		background-color:#FFF3EE;
}

</style>

<script type="text/javascript">

	//动态给js添加class属性
	function addClass(element, value) {
		if(!element.className) {
			element.className = value; //如果element本身不存在class,则直接添加class为value的值
		} else {
			element.className += " "+value; //如果element之前有一个class值,注意中间要多一个空格,然后再加上value的值
		}
	}
	
	//鼠标经过时高亮显示
	function highlightRows() {
		var rows = document.getElementsByTagName("tr");
		for(var i=0; i<rows.length; i++) {
			rows[i].oldClassName = rows[i].className; //首先保存之前的class值
			rows[i].onmouseover = function() {
				addClass(this, "highlight"); //鼠标经过时添加class为highlight的值
			}
			rows[i].onmouseout = function() {
				this.className = this.oldClassName; //鼠标离开时还原之前的class值
			}
		}
	}

	//比较之前进行数据转换
	function convert(value, dataType) {
		switch(dataType) {
			case "int":
				return parseInt(value);
				break
			case "float":
				return parseFloat(value);
				break
			case "date":
				return Date.parse(value);
				break
			default:
				return value.toString();
		}
	}

	//用于sort比较字符串
	function compareCols(col, dataType) {
		return function compareTrs(tr1, tr2) {
			value1 = convert(tr1.cells[col].innerHTML, dataType);
			value2 = convert(tr2.cells[col].innerHTML, dataType);
			if (value1 < value2) {
				return -1;
			} else if (value1 > value2) {
				return 1;
			} else {
				return 0;
			}
		};
	}

	//对表格进行排序
	function sortTable(tableId, col, dataType) {
		var table = document.getElementById(tableId);
		var tbody = table.tBodies[0];
		var tr = tbody.rows; 

		var trValue = new Array();
		for (var i=0; i<tr.length; i++ ) {
			trValue[i] = tr[i];  //将表格中各行的信息存储在新建的数组中
		}

		if (tbody.sortCol == col) {
			trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列
		} else {
			trValue.sort(compareCols(col, dataType));  //进行排序
		}

		var fragment = document.createDocumentFragment();  //新建一个代码片段,用于保存排序后的结果
		for (var i=0; i<trValue.length; i++ ) {
			fragment.appendChild(trValue[i]);
		}

		tbody.appendChild(fragment); //将排序的结果替换掉之前的值
		tbody.sortCol = col;
	}

	window.onload = function() {
		highlightRows();
	}
</script>
</head>

<body>
<div class="content">
	<h1>会员信息表(点击表格标题可进行排序)</h1>
	<table summary="user infomation table" id="tableSort">
		<thead>
			<tr>
				<th onclick="sortTable('tableSort', 0, 'int')" style="cursor: pointer;">会员ID</th>
				<th onclick="sortTable('tableSort', 1)" style="cursor: pointer;">会员名</th>
				<th onclick="sortTable('tableSort', 2)" style="cursor: pointer;">邮箱</th>
				<th onclick="sortTable('tableSort', 3)" style="cursor: pointer;">会员组</th>
				<th onclick="sortTable('tableSort', 4)" style="cursor: pointer;">城市</th>
				<th onclick="sortTable('tableSort', 5, 'date')" style="cursor: pointer;">注册时间</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>126</td>
				<td>webw3c</td>
				<td>este@126.com</td>
				<td>普通会员</td>
				<td>北京</td>
				<td>2011-04-13</td>
			</tr>
			<tr>
				<td>145</td>
				<td>test001</td>
				<td>test001@126.com</td>
				<td>中级会员</td>
				<td>合肥</td>
				<td>2011-03-27</td>
			</tr>
			<tr>
				<td>116</td>
				<td>wuliao</td>
				<td>wuliao@126.com</td>
				<td>普通会员</td>
				<td>南昌</td>
				<td>2011-04-01</td>
			</tr>
			<tr>
				<td>129</td>
				<td>tired</td>
				<td>tired@126.com</td>
				<td>中级会员</td>
				<td>北京</td>
				<td>2011-04-06</td>
			</tr>
			<tr>
				<td>155</td>
				<td>tiredso</td>
				<td>tireds0@126.com</td>
				<td>中级会员</td>
				<td>武汉</td>
				<td>2011-04-06</td>
			</tr>
			<tr>
				<td>131</td>
				<td>javascript</td>
				<td>js2011@126.com</td>
				<td>中级会员</td>
				<td>武汉</td>
				<td>2011-04-08</td>
			</tr>
			<tr>
				<td>132</td>
				<td>jQuery</td>
				<td>jQuery@126.com</td>
				<td>高级会员</td>
				<td>北京</td>
				<td>2011-04-12</td>
			</tr>
		</tbody>
	</table>
</div>

</body>
</html>
posted @ 2011-04-13 14:54  张臣  阅读(2933)  评论(7编辑  收藏  举报