在未显示可排序值的列上对HTML表进行排序。现有解决方案吗?

时间:2013-12-12 08:35:52

标签: jquery html sorting html-table hidden

我知道那里有很多桌子分拣机。例如,tablesorter,datatables等。但我没有找到任何准备好的地方,我可以在一些内部关联值上对列进行排序。易于解释的示例:日期和时间被检索为简单的UNIX整数时间,但是如果在ASCII显示的字符串上排序,则使用格式字符串格式化显示,该字符串可能不提供升序或降序日期。例如。在显示日期为12/31/2011的日期排序将不提供时间排序。我知道排序分拣机中有选项可以按日期排序,但我正在寻找超出标准类型(如日期)的数据类型的通用解决方案。

任何建议都会受到欢迎。我想用JQuery编写代码。我正在寻找更多的算法方法,而不是如何编码。例如,在哪里保持隐藏价值? Data-xxx属性,例如在列的“td”中,并且在该列的“th”中将相同的属性设置为布尔值Y或N,以指示显示的排序类型或数据值?

如果存在现有解决方案,请提及它们。我没有找到任何东西,但我可能再次错过了一个。

2 个答案:

答案 0 :(得分:1)

我使用Jquery数据表(http://datatables.net/)。您可以扩展插件以添加新的“数据格式”。

示例:

我来自西班牙,日期用格式表示:dd / mm / yyyy hh:mm:ss。

如果我使用插件用于订购日期的分拣机,则日期按字符串排序(插件的数据格式为yyyy-mm-dd hh:mm:ss)。

你必须做一个函数来返回一个整数,即日期的“权重”,'20 / 10/2013'的权重小于'15 / 11/2013'所以20/10/2013小于15/11/2013。

对于dd / mm / yyyy的格式,计算权重的函数是:(可以更改为mm / dd / yyyy更改frDateParts的索引)

function dateHeight(dateStr){
        if (trim(dateStr) != '') {
                var frDate = trim(dateStr).split(' ');
                var frTime = frDate[1].split(':');
                var frDateParts = frDate[0].split('/');
                var day = frDateParts[0] * 60 * 24; /*<--- in mm/dd/yyyy is frDateParts[1]*/
                var month = frDateParts[1] * 60 * 24 * 31; /*<--- in mm/dd/yyyy is frDateParts[0]*/
                var year = frDateParts[2] * 60 * 24 * 366;
                var hour = frTime[0] * 60;
                var minutes = frTime[1];
                var x = day+month+year+hour+minutes;
        } else {
                var x = 99999999999999999; 
        }
        return x;
}

插件的扩展名:

/* NOTE: the new format is called "date-euro" (why not? xD) so:
you have to do the "date-euro-asc" for ascendent order and the "date-euro-desc"
 for descendent order. the return of the function has to be 
-1 (lesser), 0 (equal) or 1 (greater)*/

jQuery.fn.dataTableExt.oSort['date-euro-asc'] = function(a, b) {
        var x = dateHeight(a);
        var y = dateHeight(b);
        var z = ((x < y) ? -1 : ((x > y) ? 1 : 0));
        return z;
};

jQuery.fn.dataTableExt.oSort['date-euro-desc'] = function(a, b) {
        var x = dateHeight(a);
        var y = dateHeight(b);
        var z = ((x < y) ? 1 : ((x > y) ? -1 : 0));
        return z;
};

当您使用该列的datetables插件定义表时:

 { "sType": "date-euro"},

示例(包含5列的表(Int,string,Date,string,string):

  "aoColumns": [
         { "sType": 'numeric' },
           null,
           { "sType": "date-euro"},
           null,
           null 
     ],

答案 1 :(得分:0)

是的解决方案存在。你必须在你的HTML中使用简单的jquery表分类器。它在开发时也很有用。 您可以轻松地整理所有字段或一个字段。

jQuery Table Sorter