我觉的你要改进一下思路了。
对于用户界面的操作,是很慢的,所以,swapNode 要尽量少用。
用 JS 计算循环 1000 次,本来是很快的,但要是在循环中 swapNode 1000 次,肯定很慢了。
打个比方:<td></td> 中的内容分别为:
9 1 2 3 4 5 6 7 8 0
按照你的做法,需要 swapNode 9 次,实际上,只需要 0 和 9 这两列互换一次就可以了。所以,建议先把顺序算好,把最终的结果要哪列和哪列互换确定了,再互换,结果会快很多。
对于用户界面的操作,是很慢的,所以,swapNode 要尽量少用。
用 JS 计算循环 1000 次,本来是很快的,但要是在循环中 swapNode 1000 次,肯定很慢了。
打个比方:<td></td> 中的内容分别为:
9 1 2 3 4 5 6 7 8 0
按照你的做法,需要 swapNode 9 次,实际上,只需要 0 和 9 这两列互换一次就可以了。所以,建议先把顺序算好,把最终的结果要哪列和哪列互换确定了,再互换,结果会快很多。
有什么更好的方法?
我用 JS 创建的原表格,随机性较大。用以下方法好像好一点,创建原表格的方法同上:
<html>
<head>
<script language="javascript" type="text/javascript">
function $(id)
{
return document.getElementById(id);
}
function sortFun(cellIndex)
{//排序函数
var tbl = $("gridTable");
var temp;
var values = [];
var keys = [];
var tbl_rows = [];
var len = tbl.rows.length; for(var i=0;i<len;i++)
{
values.push( tbl.rows[i].cells[cellIndex].innerText*1 );
keys.push( i );
tbl_rows.push( tbl.rows[i].cloneNode(1) );
} for(var i=1;i<len-1;i++)
{
for(var j=i+1;j<len;j++)
{
if( values[i] > values[j] ){ //value 交换
temp = values[j];
values[j] = values[i];
values[i] = temp; //key 交换
temp = keys[j];
keys[j] = keys[i];
keys[i] = temp;
}
}
}
//创建新表格
var new_tbl = tbl.cloneNode(0);
new_tbl.appendChild(tbl.tBodies[0].cloneNode(0)); for(i=0; i<len; i++){
var key = keys[i];
new_tbl.tBodies[0].appendChild(tbl_rows[key]);
}
tbl.replaceNode(new_tbl);
}
</script>
</head>
<body > <table style="width:50%" border="1" id="gridTable">
<tbody>
<tr>
<td><a href="javascript:" onClick="sortFun(0)">column1</a></td>
<td><a href="javascript:" onClick="sortFun(1)">column2</a></td>
<td><a href="javascript:" onClick="sortFun(2)">column3</a></td>
<td><a href="javascript:" onClick="sortFun(3)">column4</a></td>
<td><a href="javascript:" onClick="sortFun(4)">column5</a></td>
<td><a href="javascript:" onClick="sortFun(5)">column6</a></td>
<td><a href="javascript:" onClick="sortFun(6)">column7</a></td>
</tr>
<script language="javascript">
var cells_len = 7;
var rows_len = 800;
for(var row=0;row<rows_len;row++){
document.writeln("<tr>");
for(var cell=0;cell<cells_len;cell++){
document.writeln("<td>"+parseInt(Math.random()*10000)+"</td>");
}
document.writeln("</tr>");
}
</script>
</tbody>
</table>
</body>
</html>
<tr style="cursor:default">
<td onClick = "orderIt(this.cellIndex)">编号</td>
<td onClick = "orderIt(this.cellIndex)">姓名</td>
<td onClick = "orderIt(this.cellIndex)">年龄</td>
<td onClick = "orderIt(this.cellIndex)">单位</td>
</tr>
<tr>
<td>01220</td>
<td>张三</td>
<td>36</td>
<td>网络部</td>
</tr>
<tr>
<td>02551</td>
<td>李四</td>
<td>27</td>
<td>技术部</td>
</tr>
<tr>
<td>00020</td>
<td>王五</td>
<td>12</td>
<td>编辑部</td>
</tr>
<tr>
<td>32250</td>
<td>赵六</td>
<td>80</td>
<td>新闻部</td>
</tr>
</table>
<script language="javascript">
function orderIt(idx){
var AOrder = new Array
var obj=document.getElementById("myTab");
var allTableRows = obj.rows.length;
for(var i=1;i<allTableRows;i++){
AOrder.push(obj.rows[i].cells[idx].innerText);
AOrder.sort();
}
for(var i=1;i<allTableRows;i++){
for(var j=1;j<allTableRows;j++){
if (obj.rows[j].cells[idx].innerText==AOrder[i-1]){
obj.moveRow(j,i);
break;
}
}
}
}
</script>
<tr style="cursor:default">
<td onClick = "orderIt(this.cellIndex)" >编号 </td>
<td onClick = "orderIt(this.cellIndex)" >姓名 </td>
<td onClick = "orderIt(this.cellIndex)" >年龄 </td>
<td onClick = "orderIt(this.cellIndex)" >单位 </td>
</tr>
<tr>
<td>01220 </td>
<td >张三 </td>
<td >36 </td>
<td >网络部 </td>
</tr>
<tr>
<td >02551 </td>
<td >李四 </td>
<td >27 </td>
<td >技术部 </td>
</tr>
<tr>
<td>00020 </td>
<td >王五 </td>
<td >12 </td>
<td >编辑部 </td>
</tr>
<tr>
<td >32250 </td>
<td >赵六 </td>
<td >80 </td>
<td >新闻部 </td>
</tr>
</table>
<script language="javascript" >
function orderIt(idx){
var AOrder = new Array()
var obj=document.getElementById("myTab");
var allTableRows = obj.rows.length;
var objTbody=obj.childNodes[0]
for(var i=1;i <allTableRows;i++){
AOrder.push(new Array(obj.rows[i].cells[idx].innerText,objTbody.childNodes[i]));
AOrder.sort(function(a,b){return a[0]>b[0]});
}
for(var i=0;i <AOrder.length;i++){
objTbody.appendChild(AOrder[i][1])
}
}
</script >
------------------
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JK:支持民族工业,尽量少买X货</title>
<script language="javascript" srccccc="CommonJS_RowSort.js">
var rowSortImg=document.createElement("img");
function rowSortFun(tdObj,needCache){
var d1=new Date();
if(needCache==null) needCache=true;//default value is true;
var currentColumnIndex=tdObj.cellIndex;
if(rowSortImg.parentNode != tdObj){
tdObj.appendChild(rowSortImg);
rowSortImg.src="up.gif";
}
else if (rowSortImg.src.indexOf("down.gif")>-1){
rowSortImg.src="up.gif";
}
else{
rowSortImg.src="down.gif";
}
var currentTbody=tdObj.parentNode.parentNode;
var rowsArray=new Array();
if(needCache && tdObj.rowsArray){
rowsArray=tdObj.rowsArray;
}
else{
var rows=currentTbody.rows;
for( var i=1;i<rows.length;i++){
rowsArray[i-1]=new String(rows[i].cells[currentColumnIndex].innerHTML.toUpperCase());
rowsArray[i-1].trObj=rows[i];
}
var fun=getSortFun(tdObj);
if(getSortFun(tdObj)) rowsArray.sort(fun);
else rowsArray.sort();
if(needCache) tdObj.rowsArray=rowsArray;
}
var sortIsAsc=(rowSortImg.src.indexOf("up.gif")>-1);
if(!sortIsAsc) rowsArray.reverse();
for(var i=0;i<rowsArray.length;i++){
currentTbody.appendChild(rowsArray[i].trObj);
}
if(!sortIsAsc) rowsArray.reverse();
alert("行数"+rowsArray.length+";所花毫秒数"+(new Date()-d1));
}function getSortFun(tdObj){
if("Number"==tdObj.columnContentType){
return function (trObj1,trObj2) {return trObj1-trObj2;}
}
else return null;
}
</script>
<style>
.headerTr{background-color:#cccccc;}
</style>
</head><body>
<div style="font-size:10pt;">
注1:用法:需要排序的字段头里:<td columnContentType="Text" onclick="rowSortFun(this);"> 。 <br/>
注2:鉴于很多提出要求前台排序的人,其实并不是真的需要前台排序,所以强列建议慎用前台排序。 <br/>
注3:有关本示例的效率讨论,请参看
<a href="http://community.csdn.net/Expert/topic/5701/5701204.xml?temp=.8604547" target="_blank" >CSDN - 技术社区 - Web 开发 JavaScript : 排序代码。在示例下500条数据时,效率提高50%的得分。</a>
<br/><br/>
注:本页面仅在IE6/FireFox1.5下测试过。其它浏览器或其它版本未经测试。<br/>
注-----:JK:<a href="mailTo:[email protected]?subject=RowSortSample">[email protected]</a><br/>
<hr/>
</div><table border="1" width="100%" >
<tr class="headerTr">
<td columnContentType="Text" onclick="rowSortFun(this);" > 字符串或其它</td>
<td columnContentType="Number" onclick="rowSortFun(this);" >数字</td>
<td columnContentType="Text" onclick="rowSortFun(this);" >字符串</td>
<td columnContentType="Number" onclick="rowSortFun(this);" >数字</td>
<td >输入框(不需要排序)</td>
</tr>
<tr>
<td> </td>
<td>2</td>
<td>j</td>
<td>11</td>
<td><input value="11"></td>
</tr>
<tr>
<td>b</td>
<td>1</td>
<td>k</td>
<td>2</td>
<td><input value="连山"></td>
</tr>
<tr>
<td>c</td>
<td>1</td>
<td>j</td>
<td>3</td>
<td><input value="归藏"></td>
</tr>
<tr>
<td>d</td>
<td>0</td>
<td>i</td>
<td>4</td>
<td><input value="周易"></td>
</tr>
<tr>
<td>e</td>
<td>2</td>
<td>m</td>
<td>5</td>
<td><input value="仁者乐山智者乐水"></td>
</tr>
</table>
</body></html>