找回密码
 注册
搜索
查看: 3769|回复: 0

利用JavaScript对表格数据进行排序

[复制链接]
发表于 2009-11-13 17:10:08 | 显示全部楼层 |阅读模式

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
  5. <title>表格排序的实现</title>
  6. <style>
  7. *{font-family:Arial, Helvetica, sans-serif;font-size:14px;border:none;}
  8. body{text-align:center;}
  9. table{margin:100px auto;}
  10. td{width:110px;height:25px;text-align:center;line-height:25px;border:1px solid silver;}
  11. .red{color:red;}
  12. .top{background:#EEE;cursor:pointer;}
  13. .up{background:#FFFFCC url(http://down.psd.cn/uploads/allimg/080912/173019330.gif) no-repeat right 5px;}
  14. .down{background:#FFFFCC url(http://down.psd.cn/uploads/allimg/080912/173019334.gif) no-repeat right 5px;}
  15. .hov{background:#F0EFE5;}
  16. </style>
  17. </head>
  18. <body>
  19. <table cellpadding="0" id="table">
  20. <tr class="top"><td>kick me</td><td >kick me</td><td>kick me</td><td>kick me</td></tr>
  21. <tr>
  22.    <td><span id="bfn_la_bac.usa">15.43</span></td>
  23.    <td class="red">700</td>
  24.    <td>1.220</td>
  25.    <td class="red">源</td>
  26. </tr>
  27.     <tr><td><span id="bfn_la_c.usa">7.05</span></td>
  28.   <td class="red">4</td>
  29.   <td>3,000</td>
  30.   <td class="red">码</td>
  31.     </tr>
  32.     <tr><td><span id="bfn_la_jpm.usa">30.62</span></td>
  33.   <td class="red">30</td>
  34.   <td>2,558,800</td>
  35.   <td class="red">爱</td>
  36.     </tr>
  37.     <tr>
  38.       <td><span id="bfn_la_axp.usa">22.30</span></td>
  39.   <td class="red">5</td><td>6</td>
  40.   <td class="red">好</td>
  41.     </tr>
  42.     <tr><td><span id="bfn_la_mrk.usa">26.31</span></td>
  43.   <td class="red">0.6</td><td>5</td>
  44.   <td class="red">-</td>
  45.     </tr>
  46.     <tr><td><span id="bfn_la_pg.usa">63.16</span></td>
  47.   <td class="red">7</td><td>4</td>
  48.   <td class="red">者</td>
  49.     </tr>
  50. </table>
  51. <script type="text/javascript">

  52. var tableSort = function(){
  53.   this.initialize.apply(this,arguments);
  54. }

  55. tableSort.prototype = {

  56.   initialize : function(tableId,clickRow,startRow,endRow,classUp,classDown,selectClass){
  57.    this.Table = document.getElementById(tableId);
  58.    this.rows = this.Table.rows;//所有行
  59.    this.Tags = this.rows[clickRow-1].cells;//标签td
  60.    this.up = classUp;
  61.    this.down = classDown;
  62.    this.startRow = startRow;
  63.    this.selectClass = selectClass;
  64.    this.endRow = (endRow == 999? this.rows.length : endRow);
  65.    this.T2Arr = this._td2Array();//受影响的td二维数组
  66.    this.setShow();
  67.   },
  68.   //标签切换
  69.   setShow:function(){
  70.    var defaultClass = this.Tags[0].className;
  71.    for(var Tag ,i=0;Tag = this.Tags[i];i++){
  72.     Tag.index = i;
  73.     addEventListener(Tag ,'click', Bind(Tag,statu));
  74.    }
  75.    var _this =this;
  76.    var turn = 0;
  77.    function statu(){
  78.     for(var i=0;i<_this.Tags.length;i++){
  79.      _this.Tags[i].className = defaultClass;
  80.     }
  81.     if(turn==0){
  82.      addClass(this,_this.down)
  83.      _this.startArray(0,this.index);
  84.      turn=1;
  85.     }else{
  86.      addClass(this,_this.up)
  87.      _this.startArray(1,this.index);
  88.      turn=0;
  89.     }
  90.    }
  91.   },
  92.   //选中列样式
  93.   colClassSet:function(num,cla){
  94.    //得到关联到的td
  95.    for(var i= (this.startRow-1);i<(this.endRow);i++){
  96.     for(var n=0;n<this.rows[i].cells.length;n++){
  97.      removeClass(this.rows[i].cells[n],cla);
  98.     }
  99.     addClass(this.rows[i].cells[num],cla);
  100.    }
  101.   },
  102.   //开始排序  num 根据第几列排序  aord 逆序还是顺序
  103.   startArray:function(aord,num){
  104.    var afterSort = this.sortMethod(this.T2Arr,aord,num);//排序后的二维数组传到排序方法中去
  105.    this.array2Td(num,afterSort);//输出
  106.   },
  107.   //将受影响的行和列转换成二维数组
  108.   _td2Array:function(){  
  109.    var arr=[];
  110.    for(var i=(this.startRow-1),l=0;i<(this.endRow);i++,l++){
  111.     arr[l]=[];
  112.     for(var n=0;n<this.rows[i].cells.length;n++){
  113.      arr[l].push(this.rows[i].cells[n].innerHTML);
  114.     }
  115.    }
  116.    return arr;
  117.   },
  118.   //根据排序后的二维数组来输出相应的行和列的 innerHTML
  119.   array2Td:function(num,arr){
  120.    this.colClassSet(num,this.selectClass);
  121.    for(var i= (this.startRow-1),l=0;i<(this.endRow);i++,l++){
  122.     for(var n=0;n<this.Tags.length;n++){
  123.      this.rows[i].cells[n].innerHTML = arr[l][n];
  124.     }
  125.    }
  126.   },
  127.   //传进来一个二维数组,根据二维数组的子项中的w项排序,再返回排序后的二维数组
  128.   sortMethod:function(arr,aord,w){
  129.    //var effectCol = this.getColByNum(whichCol);
  130.    arr.sort(function(a,b){
  131.     x = killHTML(a[w]);
  132.     y = killHTML(b[w]);
  133.     x = x.replace(/,/g,'');
  134.     y = y.replace(/,/g,'');
  135.     switch (isNaN(x)){
  136.      case false:
  137.      return Number(x) - Number(y);
  138.      break;
  139.      case true:
  140.      return x.localeCompare(y);
  141.      break;
  142.     }
  143.    });
  144.    arr = aord==0?arr:arr.reverse();
  145.    return arr;
  146.   }
  147. }
  148. /*-----------------------------------*/
  149. function addEventListener(o,type,fn){
  150.   if(o.attachEvent){o.attachEvent('on'+type,fn)}
  151.   else if(o.addEventListener){o.addEventListener(type,fn,false)}
  152.   else{o['on'+type] = fn;}
  153. }

  154. function hasClass(element, className) {
  155.   var reg = new RegExp('(\\s|^)'+className+'(\\s|$)');
  156.   return element.className.match(reg);
  157. }
  158.   
  159. function addClass(element, className) {
  160.   if (!this.hasClass(element, className))
  161.   {
  162.    element.className += " "+className;
  163.   }
  164. }
  165.   
  166. function removeClass(element, className) {
  167.   if (hasClass(element, className)) {
  168.    var reg = new RegExp('(\\s|^)'+className+'(\\s|$)');
  169.    element.className = element.className.replace(reg,' ');
  170.   }
  171. }

  172. var Bind = function(object, fun) {
  173.   return function() {
  174.    return fun.apply(object, arguments);
  175.   }
  176. }
  177. //去掉所有的html标记
  178. function killHTML(str){
  179.   return str.replace(/<[^>]+>/g,"");
  180. }
  181. //------------------------------------------------
  182. //tableid  第几行是标签行,从第几行开始排序,第几行结束排序(999表示最后) 升序标签样式,降序标签样式  选中列样式
  183. //注意标签行的class应该是一致的
  184. var ex1 = new tableSort('table',1,2,999,'up','down','hov');
  185. </script>
  186. </body>
  187. </html>
复制代码

http://www.codefans.net/jscss/code/181.shtml
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-6-19 04:12 , Processed in 0.014888 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表