我觉的你要改进一下思路了。
对于用户界面的操作,是很慢的,所以,swapNode 要尽量少用。
用 JS 计算循环 1000 次,本来是很快的,但要是在循环中 swapNode 1000 次,肯定很慢了。
打个比方:<td></td> 中的内容分别为:
9 1 2 3 4 5 6 7 8 0
按照你的做法,需要 swapNode 9 次,实际上,只需要 0 和 9 这两列互换一次就可以了。所以,建议先把顺序算好,把最终的结果要哪列和哪列互换确定了,再互换,结果会快很多。

解决方案 »

  1.   

    to faisun :"swapNode 要尽量少用?"
    有什么更好的方法?
      

  2.   

    本人计算过了,即使用faisun的设想,800行最少也需要10秒才能完成。
      

  3.   

    我试过用 LZ 的方法 800 行的时候 IE 会挂掉(未响应) -_-!
    我用 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>
      

  4.   

    <table   border="1"   id="myTab">   
      <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>
      

  5.   

    1000行 还用JavaScript来排序 莫非楼主在研究类似Google的在线的啥 类似微软的Excel的东东?  ^_^就算是在研WEB版的Excel,为了性能肯定需要借助数据库,Google的肯定是编辑一个字段就提交那个字段的数据,大规模数据排序的操作肯定是后台处理后再重构怎个画面。  我没用过,猜的。
      

  6.   

    这样写800行应该不会成问题,如果想对拼音等做排序,那就在sort函数上做点分支<table   border="1"   id="myTab">    
       <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 >
      

  7.   

    以下代码,一千行一秒内可以完成---如果机器不比JK的机器差的话。
    ------------------
    <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:用法:需要排序的字段头里:&lt;td columnContentType="Text" onclick="rowSortFun(this);"&gt; 。 <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>