TableSorter jQuery -- 过滤后如何取值?
TableSorter jQuery -- How to get values after filtering?
我刚刚安装了 jQuery Tablesorter 插件并成功集成。但在我的代码中提出了一个问题,即我的 table 具有时间值,我想在过滤后收集时间值并计算其总数。
附上屏幕截图..
我想在 table 下方显示总时间,但如何收集 table 值?
我刚刚尝试了下面的代码..
$('select').on('change', function() {
var colCount = 0;
$('#mytable tbody tr td:nth-child(4)').each(function () {
if ($(this).attr('td')) {
colCount += +1;
} else {
colCount++;
}
});
alert(colCount);
});
要完成这项工作,您需要对 this answer 中的持续时间解析器进行稍微修改的版本。通过将 "sorter-times"
class 名称添加到 header 单元格来设置该列的解析器。
然后您需要包含一个自定义小部件来进行计算 (demo):
$(function () {
// change maxDigits to 4, if values go > 999
// or to 5 for values > 9999, etc.
var maxDigits = 3;
// https://whosebug.com/a/27023733/145346
$.tablesorter.addParser({
id: "times",
is: function (s) {
return false;
},
format: function (s) {
// prefix contains leading zeros that are tacked
var prefix = new Array(maxDigits + 1).join('0'),
// split time into blocks
blocks = s.split(/\s*:\s*/),
len = blocks.length,
result = [];
// add values in reverse, so if there is only one block
// (e.g. "10"), then it would be the time in seconds
while (len) {
result.push((prefix + (blocks[--len] || 0)).slice(-maxDigits));
}
// reverse the results and join them
return result.length ? result.reverse().join('') : s;
},
type: "text",
parsed: true
});
$.tablesorter.addWidget({
id: 'calcTime',
options: {
calcTime_columns: []
},
format: function (table, c, wo) {
var array, column, time, index, start, end, str,
multiplier = [1, 60, 3600]; // s, m, h
for (column = 0; column < c.columns; column++) {
if ($.inArray(column, wo.calcTime_columns) >= 0) {
array = $.tablesorter.filter.getOptions(table, column, true);
time = 0;
$.each(array, function (i, t) {
console.log(t);
end = t.length;
index = 0;
start = end - maxDigits;
while (start >= 0 && index < maxDigits) {
str = t.substring(start, end);
time += parseInt(str, 10) * multiplier[index];
index++;
start -= maxDigits;
end -= maxDigits;
}
});
}
}
// with more than one column, you'll need to target tfoot
// columns separately
$('tfoot span').html(time + ' seconds');
}
});
$('table').tablesorter({
theme: 'blue',
widgets: ['zebra', 'filter', 'calcTime'],
widgetOptions: {
// target column with a zero-based index
calcTime_columns: [3]
}
});
});
备注
- 此小部件需要过滤器小部件才能工作。我可以使用更多代码使其独立于过滤器小部件。
- 小部件设置为处理多列,但由于演示在
tfoot
中只有一个结果元素,我没有包含任何额外的编码。如果你需要,那我可以修改插件。
我刚刚安装了 jQuery Tablesorter 插件并成功集成。但在我的代码中提出了一个问题,即我的 table 具有时间值,我想在过滤后收集时间值并计算其总数。
附上屏幕截图..
我想在 table 下方显示总时间,但如何收集 table 值?
我刚刚尝试了下面的代码..
$('select').on('change', function() {
var colCount = 0;
$('#mytable tbody tr td:nth-child(4)').each(function () {
if ($(this).attr('td')) {
colCount += +1;
} else {
colCount++;
}
});
alert(colCount);
});
要完成这项工作,您需要对 this answer 中的持续时间解析器进行稍微修改的版本。通过将 "sorter-times"
class 名称添加到 header 单元格来设置该列的解析器。
然后您需要包含一个自定义小部件来进行计算 (demo):
$(function () {
// change maxDigits to 4, if values go > 999
// or to 5 for values > 9999, etc.
var maxDigits = 3;
// https://whosebug.com/a/27023733/145346
$.tablesorter.addParser({
id: "times",
is: function (s) {
return false;
},
format: function (s) {
// prefix contains leading zeros that are tacked
var prefix = new Array(maxDigits + 1).join('0'),
// split time into blocks
blocks = s.split(/\s*:\s*/),
len = blocks.length,
result = [];
// add values in reverse, so if there is only one block
// (e.g. "10"), then it would be the time in seconds
while (len) {
result.push((prefix + (blocks[--len] || 0)).slice(-maxDigits));
}
// reverse the results and join them
return result.length ? result.reverse().join('') : s;
},
type: "text",
parsed: true
});
$.tablesorter.addWidget({
id: 'calcTime',
options: {
calcTime_columns: []
},
format: function (table, c, wo) {
var array, column, time, index, start, end, str,
multiplier = [1, 60, 3600]; // s, m, h
for (column = 0; column < c.columns; column++) {
if ($.inArray(column, wo.calcTime_columns) >= 0) {
array = $.tablesorter.filter.getOptions(table, column, true);
time = 0;
$.each(array, function (i, t) {
console.log(t);
end = t.length;
index = 0;
start = end - maxDigits;
while (start >= 0 && index < maxDigits) {
str = t.substring(start, end);
time += parseInt(str, 10) * multiplier[index];
index++;
start -= maxDigits;
end -= maxDigits;
}
});
}
}
// with more than one column, you'll need to target tfoot
// columns separately
$('tfoot span').html(time + ' seconds');
}
});
$('table').tablesorter({
theme: 'blue',
widgets: ['zebra', 'filter', 'calcTime'],
widgetOptions: {
// target column with a zero-based index
calcTime_columns: [3]
}
});
});
备注
- 此小部件需要过滤器小部件才能工作。我可以使用更多代码使其独立于过滤器小部件。
- 小部件设置为处理多列,但由于演示在
tfoot
中只有一个结果元素,我没有包含任何额外的编码。如果你需要,那我可以修改插件。