Плагин jQuery tablesorter вторичная "скрытая" сортировка - PullRequest
21 голосов
/ 04 марта 2012

Я использую плагин jQuery tablesorter, и у меня есть столбец, который содержит название месяца и года, например:

April, 1975
January, 2001

Я бы хотел отсортировать этот столбец, как если бы он был столбцом даты.Насколько я понимаю, столбец можно отсортировать по другому «скрытому» значению, но я просто не могу найти документацию для этой функции.Есть какая-нибудь помощь?

Обновление

Этот форк http://mottie.github.com/tablesorter/docs/index.html из TableSorter имел именно то, что мне было нужно;способность сохранять значение для сортировки в атрибуте работала очень хорошо.

Ответы [ 6 ]

36 голосов
/ 07 марта 2013

Просто с помощью функции textExtraction. Установите data-sort-value на ваших TD. По умолчанию используется обычный текст, если его нет.

$(".sort-table").tablesorter({
    textExtraction: function(node) {
        var attr = $(node).attr('data-sort-value');
        if (typeof attr !== 'undefined' && attr !== false) {
            return attr;
        }
        return $(node).text(); 
    } 
}); 
20 голосов
/ 11 марта 2012

У меня есть форк tableorter , который позволяет вам написать синтаксический анализатор, который может извлечь атрибуты данных из ячейки таблицы, а также назначить определенную textExtraction для каждого столбца .

$(function(){

  $.tablesorter.addParser({ 
    // set a unique id 
    id: 'myParser', 
    is: function(s) { 
      // return false so this parser is not auto detected 
      return false; 
    }, 
    format: function(s, table, cell, cellIndex) { 
      // get data attributes from $(cell).attr('data-something');
      // check specific column using cellIndex
      return $(cell).attr('data-something');
    }, 
    // set type, either numeric or text 
    type: 'text' 
  }); 

  $('table').tablesorter({ 
    headers : { 
      0 : { sorter: 'myParser' }
    }
  });

});
10 голосов
/ 09 февраля 2017

Прошу прощения за ответ на старый вопрос, но теперь это СТАНДАРТНАЯ ОСОБЕННОСТЬ tableports , хотя по какой-то причине он не задокументирован. Если вы откроете файл https://github.com/christianbach/tablesorter/blob/master/jquery.tablesorter.js и посмотрите на строку # 307, вы увидите, что она поддерживает атрибут «data-sort-value».

Использование:

<td data-sort-value="42">Answer to the question</td>
4 голосов
/ 28 апреля 2015

Это что-то вроде взлома (окей, это полный взлом), но если вы установите парсер для столбца на «текст», и предварительно исправите ваш симпатичный вывод строкой, которую вы действительно хотите отсортировать в пределах скрытый промежуток, он будет отсортирован правильно.

Вы можете установить синтаксический анализатор для столбца с параметром headers, например, чтобы установить синтаксический анализатор в первом и втором столбцах на «текст», вы должны установить следующее:

headers: {0: {sorter: 'text'}, : {sorter: 'text'}

Чтобы сделать этот трюк с датами, вы можете использовать формат даты ISO8601, который сортирует лексически. * JS Date объекты могут генерировать строки даты ISO8601 с помощью функции toISOString().

Учитывая CSS:

span.hidden{
    display:none;
}

Пример ячейки в таблице будет выглядеть так:

<td><span class="hidden">2015-04-18T23:48:33</span>19 April 2015</td>

Не самый красивый код в мире, но он работает.

2 голосов
/ 24 октября 2017

Я использую

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.29.0/js/jquery.tablesorter.min.js"></script>

Рабочая с данными-текстом

<td data-text="42">Answer to the question</td>

Не работает со значением сортировки данных

<td data-sort-value="42">Answer to the question</td>
2 голосов
/ 04 марта 2012

Вам нужно написать свой собственный парсер . Ваш парсер может выглядеть примерно так:

var months = {'January':1,'February':2, ...};
$.tablesorter.addParser({
    id: 'myDate', 
    is: function(s) { return false; }, 
    format: function(s) {
        var x = s.split(', ');
        return x[1]+'-'+months[x[2]];
    },
    type: 'numeric' 
});

Не проверено, но общая идея.

...