sortTable组件

44 篇文章 0 订阅
11 篇文章 0 订阅

 

#sortTable.js

 

 

/*
	说明:
	1. 该组件用于将一个普通的table,变成一个可以排序的table,同时可以添加奇数偶数行的样式(支持自定义)
	2. JSLogger.js 是一个记录日志的组件,不用的话,可以将类似JSLogger的代码全部删掉,不会影响当前组件。
	3. 兼容:IE7 8 9,FF,chorme
*/


//缓存table数据的对象
//使用table的ID作为属性进行访问
var tableMap = {};


/**
* 更新table的方法
* 更新后支持:奇偶样式(),表头排序
*@param tableId 表的ID
*@param config 配置信息
*	- widths	各个列的宽度数组 默认[200,200]
*	- oldEven	奇偶样式数据,默认["old","even"]\
*   - sortType	排序类型:txt文本,int数值类型 默认都是文本排序
**/
function updateTable(tableId,config){
	config = config ||{};
	config.widths = config.widths ||[200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200];//默认200px宽度
	config.sortType = config.sortType || ["txt","txt","txt","txt","txt","txt","txt","txt","txt","txt","txt","txt","txt"];
	config.oldEven = config.oldEven ||["sort_old","sort_even"];//默认奇偶样式
	var tableObj = document.getElementById(tableId);
	if(tableObj==null){return;}
	
	//是否需要缓存数据:如果没有缓存数据,则进行如下操作
	if(!!tableMap[tableId]==false){
		var rows = tableObj.rows;
		var len  = rows.length;
		for(var i=1;i<len;i++){
			var row = rows[i];			
			if(i%2==0){
				row.className = config.oldEven[0];
				row.classNameOld = config.oldEven[0];
			}else{
				row.className = config.oldEven[1];
				row.classNameOld = config.oldEven[1];
			}
		}


		JSLogger.log("缓存table");
		//tableObj.className="sortTable";
		tableObj.setAttribute("cellpadding","0");
		tableObj.setAttribute("cellspacing","0");
		tableObj.setAttribute("border","0");

		var tempArr = [];
		for(var i=0;i<len;i++){
			var row = rows[i];
			var rowArr = [];
			if(i>0){//第一行不拷贝
				var cells = row.cells;
				for(var k=0;k<cells.length;k++){
					rowArr.push(cells[k].innerHTML);//只保存td的html
				}
				tempArr.push(rowArr);
			}
		}
		tableMap[tableId] = tempArr;
		JSLogger.log(tempArr,true);

		
		//给table的head添加时间监听
		JSLogger.log("给table的head添加事件监听");
		var head  = rows[0];
		var cells = head.cells;
		for(var j=0;j<cells.length;j++){
			var cell = cells[j];
			//添加排序图标
			var sortSpan = document.createElement("SPAN");
			sortSpan.className = "sort_asc_def";
			sortSpan.setAttribute("name","sortSpan");			
			sortSpan.setAttribute("sortType",config.sortType[j]);
			sortSpan.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;";
			sortSpan.setAttribute("tableId",tableId);//存储表ID
			sortSpan.setAttribute("colIndex",j);//存储列索引
			sortSpan.setAttribute("sort","desc");//存储排序顺序
			cell.appendChild(sortSpan);

			cell.className="sort_head";
			if(config.widths){
				cell.style.width = (config.widths[j]+"px" || "");
			}
			//排序图标添加click点击事件:兼容IE\FF\Chrome
			if(window.attachEvent){
				sortSpan.attachEvent("onclick",function (sortSpan,config) {  
					return function (){  
						sortTable(sortSpan,config);  
					}  
				}(sortSpan,config));
				//表头不可以选中
				cell.attachEvent("onselectstart",function (cell) {  
					return function (){  
						return false;  
					}  
				}(cell));
			}else{//FF ,chrome
				sortSpan.addEventListener("click",function (sortSpan,config) {  
					return function (){  
						sortTable(sortSpan,config);  
					}  
				}(sortSpan,config),false);
				//表头不可以选中:在css样式中实现
			}
		}
	}
	
}
/*排序的方法
*@param tdDom 当前TD对象
*@param config 配置信息(详细说明见updateTable方法)
*
*/
function sortTable(tdDom,config){
	//JSLogger.log("tdDom.tableId  = "+tdDom.getAttribute("tableId") +",tdDom.colIndex = "+tdDom.getAttribute("colIndex"));//+",innerHTML = "+tdDom.innerHTML);
	JSLogger.log("sort = "+tdDom.getAttribute("sort")+",sortType = "+tdDom.getAttribute("sortType"));
	var tableId = tdDom.getAttribute("tableId");
	var sort = tdDom.getAttribute("sort");
	var colIndex = tdDom.getAttribute("colIndex");
	var table = document.getElementById(tableId);
	var sortType = tdDom.getAttribute("sortType");//txt文字排序/int数值排序
	//var rows = [];
	//除第一样以外,全部删除
	while(table.rows[1]){  
		//rows.push(table.rows[1]);
		table.deleteRow(1);  
	}   
	setTimeout(function(){
		//从缓存中获取原始table的所有行
		var rowsData = tableMap[tableId];
		var colLen = rowsData[0].length;
		var JSON  ={colIndex:colIndex,sort:sort,sortType:sortType};
		rowsData = sortRows(rowsData,JSON);//;
		//JSLogger.log(rowsData[0][0]);
		for(var i=0;i<rowsData.length;i++){
			var row = table.insertRow(-1); 
			//奇偶样式
			if(i%2==1){
				row.className = config.oldEven[0];
				row.setAttribute("classNameOld",config.oldEven[0]);
			}else{
				row.className =  config.oldEven[1];
				row.setAttribute("classNameOld",config.oldEven[1]);
			}
			
			//注入td内容
			for(var j=0;j<colLen;j++){
				var cell = row.insertCell(-1); 
				cell.innerHTML = rowsData[i][j];
			}
		}
	},0);
	//重置所有排序图标 :name="sortSpan"
	var spanArr = document.getElementsByTagName("span");
	for(var k=0;k<spanArr.length;k++){
		var span = spanArr[k];
		if("sortSpan"==span.getAttribute("name") && "sort_desc"==span.className){
			span.className = "sort_desc_dis";
		}else if("sortSpan"==span.getAttribute("name") && "sort_asc"==span.className){
			span.className = "sort_asc_dis";
		}
	}
	//最后重置排序
	if("desc"==sort){
		tdDom.setAttribute("sort","asc");
		tdDom.className = "sort_desc";
	}else{
		tdDom.setAttribute("sort","desc");
		tdDom.className = "sort_asc";
	}
	
}

/*
*自定义数组排序方法
*@param rows 一个table的所有行的数据
*@param JSON 参数
*	-colInex 列索引 按照那个列进行排序
*	-sort 正序还是反序 asc/desc
*	-sortType 	txt文本排序/int 数值排序
*/
function sortRows(rows,JSON){
	var colIndex = JSON.colIndex;
	var sort = JSON.sort;
	var sortType = JSON.sortType;

	//JSLogger.log(rows,true);
	JSLogger.log("colIndex = "+colIndex+",sort = "+sort+",sortType = "+sortType);
	rows = rows.sort(function(row1,row2){
		if("txt"==sortType){//文本排序
			if("asc"==sort){
				if((row1[colIndex]>row2[colIndex])===true){return 1;}
				else if(( row1[colIndex]<row2[colIndex])===true){return -1;}
				else{return 0;}
			}else{
				if((row1[colIndex]>row2[colIndex])===true){return -1;}
				else if(( row1[colIndex]<row2[colIndex])===true){return 1;}
				else{return 0;}
			}
		}else{//数值排序
			if("asc"==sort){
				return parseFloat(row1[colIndex])- parseFloat(row2[colIndex]);
			}else{
				return -(parseFloat(row1[colIndex])- parseFloat(row2[colIndex]));
			}
		}
	});
	return rows;
}
 

 

附件是完整代码和实例。

 

欢迎指正

 

 

 

 

 

 

 

 

 

 

 

愤怒的jser -  好东西就要共享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 HTML 中的 `<table>` 元素来创建可排序的表格。以下是一个示例: ```html <table> <thead> <tr> <th onclick="sortTable(0)">Name</th> <th onclick="sortTable(1)">Age</th> <th onclick="sortTable(2)">Country</th> </tr> </thead> <tbody> <tr> <td>John</td> <td>25</td> <td>USA</td> </tr> <tr> <td>Jane</td> <td>30</td> <td>Canada</td> </tr> <tr> <td>Bob</td> <td>20</td> <td>UK</td> </tr> </tbody> </table> <script> function sortTable(n) { var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0; table = document.querySelector("table"); switching = true; dir = "asc"; while (switching) { switching = false; rows = table.rows; for (i = 1; i < (rows.length - 1); i++) { shouldSwitch = false; x = rows[i].getElementsByTagName("td")[n]; y = rows[i + 1].getElementsByTagName("td")[n]; if (dir == "asc") { if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) { shouldSwitch = true; break; } } else if (dir == "desc") { if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) { shouldSwitch = true; break; } } } if (shouldSwitch) { rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); switching = true; switchcount ++; } else { if (switchcount == 0 && dir == "asc") { dir = "desc"; switching = true; } } } } </script> ``` 在上述示例中,我们创建了一个包含三列的表格,并在每个表头单元格上添加了一个 `onclick` 事件处理程序,以便用户单击标题时可以对表格进行排序。 `sortTable()` 函数使用冒泡排序算法对表格中的数据进行排序,并根据用户单击的表头单元格的方向(升序或降序)进行排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值