改进jquery.tablesorter.js 支持中文表格排序

 

     之前研究过一下表格排序。上网找了一些代码研究了一下。勉强做了一个用着。后面发现当动态给单元格加超链接,或者列中存在一些空白,就排序不了了。

代码: 仿一个网友的代码写的,不记得出自哪里了,改成可以支持中文排序,而且支持控件value的排序。 没办法,能力有限,只能。。。

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
// 转换器,将列的字段类型转换为可以排序的类型:String,int,float
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();
    }


//  汉字排序方法 
function chrComp(a,b)
{
    
return  a.localeCompare(b);


// 排序函数产生器
function generateCompareTRs(iCol, sDataType,isinput,sDec) 
{
    
return   function compareTRs(oTR1, oTR2) 
    {
        
if (isinput  ==   1 )
        {
            var vValue1 
=  convert(oTR1.getElementsByTagName( " input " )[iCol].value);
            var vValue2 
=  convert(oTR2.getElementsByTagName( " input " )[iCol].value);
        }
        
else
        {
            var vValue1 
=  convert(oTR1.cells[iCol].firstChild.nodeValue, sDataType);
            var vValue2 
=  convert(oTR2.cells[iCol].firstChild.nodeValue, sDataType);
        }
        
if (sDec == ' desc ' )
        {
            
if (sDataType == ' int '
            {
                
return  vValue1   ==   vValue2  ?   0  :(vValue1  -  vValue2  < 0   ?   1  :  - 1 );
            }
            
else   if (sDataType  == ' cn ' )
            {
                
if (chrComp(vValue1,vValue2) > 0 )
                {
                    
return   - 1 ;
                }
                
else   if (chrComp(vValue1,vValue2) < 0 )
                {
                    
return   1 ;
                }
                
else
                {
                    
return   0 ;
                }
            }
            
else
            {
                
if  (vValue1  >  vValue2) {
                    
return   - 1 ;
                } 
else   if  (vValue1  <  vValue2) {
                    
return   1 ;
                } 
else  {
                    
return   0 ;
                }
            } 

        }
        
else   if (sDec == ' asc ' )
        {
            
if (sDataType == ' int ' )
            {
                
return   vValue1   ==   vValue2  ?   0  :(vValue1  -  vValue2  > 0   ?   1  :  - 1 );
            }
            
else   if (sDataType  == ' cn ' )
            {
                
return  chrComp(vValue1,vValue2);
            }
            
else
            {
                
if  (vValue1  >  vValue2) {
                    
return   1 ;
                } 
else   if  (vValue1  <  vValue2) {
                    
return   - 1 ;
                } 
else  {
                    
return   0 ;
                }
            }    
        }
    };


// 重置单元格的classname
function ChangeClsName(tr,num)
{
    num 
=  num % 2 ? 1 : 2 ;
    num.toString();
    
for  ( var  i  =   0  ; i  <  tr.childNodes.length; i  ++  )
    {
        tr.childNodes[i].className 
=   " row "   +  num
    }


/* 排序方法(主函数)
sTableID 表格的id
iCol表示列索引
    1,当不是input类型时,iCol表示的是tr的第几个td; 
    2,当是input类型时,则iCol表示在这个tr中的第几个input;
sDataType表示该cell的数据类型或者该input的value 的数据类型. 默认是string,也可以int, float. cn是中文
isinput表示排序的内容是不是input(1是, 0否) 
sDec表示倒序还是顺序(desc, 默认顺序), 避免出现input值改变之后再排序时候出现直接倒序的情况。
*/
function sortTable(sTableID, iCol, sDataType, isinput, sDec) 
{
    var oTable 
=  document.getElementById(sTableID);
    var oTBody 
=  oTable.tBodies[ 0 ];
    var colDataRows 
=  oTBody.rows;
    var aTRs 
=   new  Array;
    
// 将所有列放入数组
     for  (var i = 0 ; i  <  colDataRows.length; i ++
    {
        aTRs[i] 
=  colDataRows[i];
    } 

    aTRs.sort(generateCompareTRs(iCol, sDataType,isinput, sDec)); 

    var oFragment 
=  document.createDocumentFragment();
    
for  (var i = 0 ; i  <  aTRs.length; i ++
    {
        oFragment.appendChild(aTRs[i]);
        ChangeClsName(aTRs[i],i);
    }
    oTBody.appendChild(oFragment);
}

 


     这个星期终于有时间研究一下jquery,一直很想学的。可惜公司用不到,其实是学了之后还是觉得用的到。 知道jqery后就看了一下别人的插件。jquery.tablesorter.js 这个插件功能挺强大。试了一下,发现不支持中文的。 看看源码在说

 

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
代码 
/*  sorting methods  */
function multisort(table,sortList,cache) {
    
if (table.config.debug) { var sortTime  =   new  Date(); }
    var dynamicExp 
=   " var sortWrapper = function(a,b) { " , l  =  sortList.length;
    
for (var i = 0 ; i  <  l; i ++ ) {
        var c 
=  sortList[i][ 0 ];
        var order 
=  sortList[i][ 1 ];
        var s 
=  (getCachedSortType(table.config.parsers,c)  ==   " text " ?  ((order  ==   0 ?   " sortText "  :  " sortTextDesc " ) : ((order  ==   0 ?   " sortNumeric "  :  " sortNumericDesc " );
        var e 
=   " e "   +  i;
        dynamicExp 
+=   " var  "   +  e  +   "  =  "   +  s  +   " (a[ "   +  c  +   " ],b[ "   +  c  +   " ]);  " ;
        dynamicExp 
+=   " if( "   +  e  +   " ) { return  "   +  e  +   " ; }  " ;
        dynamicExp 
+=   " else {  " ;
    }
    
for (var i = 0 ; i  <  l; i ++ ) {
        dynamicExp 
+=   " };  " ;
    }
    dynamicExp 
+=   " return 0;  " ;    
    dynamicExp 
+=   " };  " ;    
    eval(dynamicExp);
    cache.normalized.sort(sortWrapper);
    
if (table.config.debug) { benchmark( " Sorting on  "   +  sortList.toString()  +   "  and dir  "   +  order +   "  time: " , sortTime); }
    
return  cache;
}; 

function sortText(a,b) {
    
return  ((a  <  b)  ?   - 1  : ((a  >  b)  ?   1  :  0 ));
}; 

function sortTextDesc(a,b) {
    
return  ((b  <  a)  ?   - 1  : ((b  >  a)  ?   1  :  0 ));
};    

function sortNumeric(a,b) {
    
return  a - b;
}; 

function sortNumericDesc(a,b) {
    
return  b - a;
}; 

function getCachedSortType(parsers,i) {
    
return  parsers[i].type;
};

 


一开始还以为会遇到一些困难的。没想到,我只需要把他的排序函数改一下就ok啦.

 

function sortText(a,b) {
    
return  a.localeCompare(b);
}; 

function sortTextDesc(a,b) {
    
return   - a.localeCompare(b);
};

 

测试一下。中文,中英文一起,中间有列为空等都没问题了。

本来这个插件是有一个jquery.tablesorter.pack.js 压缩过后的才9kb,可是我只会改jquery.tablesorter.js (23kb)。要怎么把它变成jquery.tablesorter.pack.js 就不知道了。

 

 

ps:当然这个插件还有很多扩展功能,例如多列排序,各种例子等都有文档可以参考的。原文件和例子网上应该挺多的。有需要的 童鞋  可以留个邮箱给我

 

转载于:https://www.cnblogs.com/novus/archive/2009/12/08/1619090.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值