Я использую JQuery Tablesorter версии 2.17.8 для сортировки таблицы
Я создал собственный синтаксический анализатор для сортировки даты, затем времени и необязательной строки.
Парсер выглядит так:
$.tablesorter.addParser({
id: "datetime",
is: function (s) {
return /\d{2}\-\d{2}\-\d{2}\s\d{2}:\d{2}(door \w+)?/.test(s);
}, format: function (s) {
arr = s.split(/[\s\-:]/);
if(arr[0] == "") // table column is empty
timestamp = null;
else {
// Month is zero-indexed so subtract one from the month inside the constructor
date = new Date(Date.UTC('20' + arr[2], arr[1] - 1, arr[0], arr[3], arr[4])); // Y M D H M
timestamp = date.getTime();
}
console.log(timestamp);
return timestamp;
}, type: "numeric"});
Пример данных столбца таблицы для сортировки:
Парсер работает как задумано, но я хочу, чтобы пустые ячейки были отсортированы снизу, и это, похоже, не работает.
Я поместил это в мой файл PHP:
<script type="text/javascript">
{literal}
$(document).ready(function()
{
$("#betalingen").tablesorter( {
headers: {
5 : { sorter: false } }, // disable sorting for column #5
widgets: ["saveSort", "zebra"], // apply alternating row coloring
sortList: [[2,0]], // initial sorting order for Date column = ascending (0)
emptyTo: 'bottom' // empty cells are always at the bottom
}
);
} );
{/literal}
</script>
Обратите внимание, что я попробовал каждый вариант здесь: http://mottie.github.io/tablesorter/docs/example-option-sort-empty.html
И когда я удаляю свой пользовательский анализатор (и позволяю Tablesorter выяснить синтаксический анализатор), он сортирует пустые ячейки снизу, как и предполагалось, но, очевидно, столбец сортируется неправильно.
Кто-нибудь знает, что здесь происходит?
Вам нужно немного подправить свой парсер.
is
функция, так как вы можете установить синтаксический анализатор на столбец и не нужно автоматически его обнаруживать.Как заметил @karlingen, когда ячейка пуста, вы все равно возвращаетесь timestamp
который был установлен в нуль; он сохраняется как ноль, а не как пустая строка.
$.tablesorter.addParser({
id: "datetime",
is: function (s) {
// no need to auto-detect
return false;
},
format: function (s) {
var date, timestamp,
arr = s.split(/[\s\-:]/);
if (arr[0] !== "") {
// Month is zero-indexed so subtract one from the month inside the constructor
date = new Date(Date.UTC('20' + arr[2], arr[1] - 1, arr[0], arr[3], arr[4])); // Y M D H M
timestamp = date.getTime();
}
// is date really a date?
return date instanceof Date && isFinite(date) ? timestamp : s;
},
type: "numeric"});
Других решений пока нет …