随笔-103  评论-37  文章-0  trackbacks-0
<html>
<head>
<title>SortTable2</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript">
var k=0;
/**************************************************************************
排序的主方法,有三个形参,STableTd,iCol,sDataType分别为需要排序的表格ID,
需要排序的表格列号,所在列的数据类型(支持int,float,date,string四种数据类型)
*************************************************************************
*/

function sortTable(sTableId,iCol,sDataType)
{
    
var oTable=document.getElementById(sTableId);//获取表格的ID 
    var oTbody=oTable.tBodies[0]; //获取表格的tbody
    var colDataRows=oTbody.rows; //获取tbody里的所有行的引用

    
var aTRs=new Array(); //定义aTRs数组用于存放tbody里的行
    for(var i=0;i<colDataRows.length;i++)  //依次把所有行放如aTRs数组
    {
        aTRs.push(colDataRows[i]);
    }

    
/***********************************************************************
    sortCol属性是额外给table添加的属性,用于作顺反两种顺序排序时的判断,区分
    首次排序和后面的有序反转
    ***********************************************************************
*/

    
if(oTable.sortCol==iCol)  //非首次排序
    {
        aTRs.reverse();
    }

    
else    //首次排序
    {
        
if(k%2==0)  //升序
        {
            aTRs.sort(generateCompareTRs(iCol,sDataType));
        }

        
else if(k%2==1//降序
        {
            aTRs.sort(generateCompareTRs1(iCol,sDataType));
        }

    }


    
var oFragment=document.createDocumentFragment();    //创建文档碎片
    for(var i=0;i<aTRs.length;i++)   //把排序过的aTRs数组成员依次添加到文档碎片
    {
        oFragment.appendChild(aTRs[i]);
    }

    oTbody.appendChild(oFragment);  
//把文档碎片添加到tbody,完成排序后的显示更新 
    oTable.sortCol=iCol;    //把当前列号赋值给sortCol,以此来区分首次排序和非首次排序,//sortCol的默认值为-1
}
;

//比较函数,用于两项之间的排序
//
升序
function generateCompareTRs(iCol,sDataType)
{
    
return   function compareTRs(oTR1,oTR2)
    
{
        
var vValue1=convert(oTR1.cells[iCol].firstChild.nodeValue,sDataType);
        
var vValue2=convert(oTR2.cells[iCol].firstChild.nodeValue,sDataType);
        
if(vValue1<vValue2)
        
{
            
return -1;
        }

        
else if(vValue1>vValue2)
        
{
            
return 1;
        }

        
else
        
{
            
return 0;
        }

    }
;
}
;

//降序
function generateCompareTRs1(iCol,sDataType)
{
    
return   function compareTRs(oTR1,oTR2)
    
{
        
var vValue1=convert(oTR1.cells[iCol].firstChild.nodeValue,sDataType);
        
var vValue2=convert(oTR2.cells[iCol].firstChild.nodeValue,sDataType);
        
if(vValue1>vValue2)
        
{
            
return -1;
        }

        
else if(vValue1<vValue2)
        
{
            
return 1;
        }

        
else
        
{
            
return 0;
        }

    }
;
}
;

//数据类型转换函数
function convert(sValue,sDataType)
{
    
switch(sDataType)
    
{
        
case "int":return parseInt(sValue);
        
case "float"return parseFloat(sValue);
        
case "date":return new Date(Date.parse(sValue));
        
default:return sValue.toString();
    }

}
;

</script>
</head>
<body>
<form name="f1" id="f1" action="" method="post">
<table border="1" id="tblSort" sortCol="-1">
<thead>
  
<tr>
   
<th onClick="sortTable('tblSort',0);" style="cursor:pointer">Last Name</th>
   
<th onClick="sortTable('tblSort',1)" style="cursor:pointer">First Name</th>
   
<th onClick="sortTable('tblSort',2,'date')" style="cursor:pointer">Birthday</th>
   
<th onClick="sortTable('tblSort',3,'int')" style="cursor:pointer">Silbings</th>
  
</tr>
</thead>
<tbody>
  
<tr>
    
<td>Simth</td>
    
<td>John</td>
    
<td>7/12/1978</td>
    
<td>2</td>
  
</tr>
  
<tr>
    
<td>Johnson</td>
    
<td>Betty</td>
    
<td>5/12/1965</td>
    
<td>5</td>
  
</tr>
  
<tr>
    
<td>Henderson</td>
    
<td>Nathan</td>
    
<td>10/15/1977</td>
    
<td>3</td>
  
</tr>
  
<tr>
    
<td>Willianms</td>
    
<td>James</td>
    
<td>2/25/1949</td>
    
<td>1</td>
  
</tr>
  
<tr>
    
<td>Gilliam</td>
    
<td>Michael</td>
    
<td>7/8/1980</td>
    
<td>4</td>
  
</tr>
  
<tr>
    
<td>Walker</td>
    
<td>Matthew</td>
    
<td>6/18/1981</td>
    
<td>3</td>
  
</tr>
</tbody>     
</table>
</form>
</body>
</html>
posted on 2008-11-06 16:42 鱼有所思 阅读(2220) 评论(2)  编辑 收藏 引用 网摘 所属分类: AJAX

评论:
# re: JS点击标题排序 2008-11-06 16:45 | 鱼有所思
字段名作为链接:
<a href='thispage.jsp?orderby=字段名'>字段名</a>

页面上面添加代码
<%
String orderby=request.getParameter("orderby");
if(orderby!=null){
//重新从数据库取数据,sql语句加上 "ORDER BY "+orderby
}
%>

如果还需要点一下升序,再点一下降序,就在链接上再加一个参数如:
<a href='thispage.jsp?orderby=字段名&ascOrDesc=<%=ascOrDesc%>字段名</a>
代码改为:
<%
String orderby=request.getParameter("orderby");
  String ascOrDesc=request.getParameter("ascOrDesc");
if(orderby!=null&&ascOrDesc!=null)
//重新从数据库取数据,sql语句加上 "ORDER BY "+orderby +" "+ascOrDesc
}
//然后把ascOrDesc变量的值取反(即asc变为desc或相反),用于设置链接,以便下次点击,排序逆转
if(ascOrDesc.equalsIgnoreCase("ASC"))ascOrDesc="DESC";
else if(ascOrDesc.equalsIgnoreCase("DESC"))ascOrDesc="ASC";

%>

  回复  更多评论
  
# re: JS点击标题排序 2008-11-06 16:46 | 鱼有所思
获得数据后在javascript中用数组保存,初始化该数组data[][]
写一个排序的函数对该数组按某个字段进行排序 function sortby( field ){...//对data进行排序}
写一个在页面显示该数组的函数.
function display()
{
....
document.forms[formid].elementid.innerHtml=" ....";
....
}

function execute()
{
sortby( XXX );
display();
}

<form id="formid" onload="execute()">
<table>
<tr><td onclick="sortby(a)"></td>
<td onclick="sortby(a)"></td>
<td onclick="sortby(a)"></td>
</tr></table>
<table id="elementid"></table>
</form>  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: