Как я могу отсортировать столбцы с входными элементами?

У меня есть такая таблица:

|   Update   |   Name  |  Code      | modification date |
|            |   name1 | code1      | 2009-12-09        |
|            |   name2 | otehercode | 2007-09-30        | 

Где столбец «Обновление» содержит флажки <input type='checkbox' />.

Начальное состояние флажка определяется до рендеринга таблицы, но после выборки строк из базы данных (оно основано на наборе условий на стороне сервера).

Флажок может быть установлен по умолчанию, снят по умолчанию или отключен (disabled='disabled' как атрибут input).

Я использую Tablesorter jQuery для сортировки таблиц. И я хотел бы иметь возможность сортировать по столбцу, содержащему флажки. Как это возможно (может быть, я мог бы передать некоторые дополнительные атрибуты моему элементу input, если бы это помогло...)?

Должен ли я написать свой собственный парсер, чтобы справиться с этим?


person kender    schedule 16.12.2009    source источник


Ответы (7)


Добавьте скрытый диапазон непосредственно перед вводом и включите в него некоторый текст (который будет использоваться для сортировки столбца). Что-то вроде:

<td>
    <span class="hidden">1</span>
    <input type="checkbox" name="x" value="y">
</td>

При необходимости вы можете прикрепить событие к флажку, чтобы оно изменяло содержимое предыдущего элемента (диапазон) при установке или снятии флажка:

$(document).ready(function() {

    $('#tableid input').click(function() {
         var order = this.checked ? '1' : '0';
         $(this).prev().html(order);
    })

})

Примечание. Я не проверял код, поэтому в нем могут быть ошибки.

person salgiza    schedule 16.12.2009
comment
Я пробовал это, и это не работает для меня. Другие столбцы сортируются, а столбец с флажком - нет. Каждый раз, когда флажок установлен/снят, он обновляет скрытое значение диапазона 1/0. Я вижу, как это происходит в Firebug. - person Martin; 25.02.2011
comment
Ааа... проблема в том, что TableSorter кэширует отформатированные данные, чтобы сделать сортировку быстрой. Всякий раз, когда вы меняете ввод, вам нужно вызывать функцию обновления, например: $(this).parents(table).trigger(update); - person Martin; 25.02.2011

Это более полная/правильная версия ответа Хаарта.

$(document).ready(function() {
    $.tablesorter.addParser({ 
        id: "input", 
        is: function(s) { 
            return false; 
        }, 
        format: function(s, t, node) {
            return $(node).children("input[type=checkbox]").is(':checked') ? 1 : 0;
        }, 
        type: "numeric" 
    });

    sorter = $("#table").tablesorter({"headers":{"0":{"sorter":"input"}}});
// The next makes it respond to changes in checkbox values 
    sorter.bind("sortStart", function(sorter){$("#table").trigger("update");});

}); 
person Aaron Schif    schedule 26.03.2013
comment
Протестировано с помощью tablesorter 2.0.5 и firefox 38. Парсер работает нормально, но когда вы добавляете последний вызов sorter.bind(), firefox либо зависает, либо выдает сообщение о переполнении стека/слишком много рекурсии. В результате сортировка таблицы действительна только для начальных значений флажка. - person thanassis; 28.05.2015

Я добавляю этот ответ, потому что использую поддерживаемую/разветвленную библиотеку jQuery TableSorter с новыми функциями. Включена необязательная библиотека парсера для полей ввода/выбора.

http://mottie.github.io/tablesorter/docs/

Вот пример: http://mottie.github.io/tablesorter/docs/example-widget-grouping.html, и это делается путем включения библиотеки синтаксического анализатора ввода/выбора "parser-input-select.js", добавления объекта заголовков и объявления столбцов и типа синтаксического анализа.

headers: {
  0: { sorter: 'checkbox' },
  3: { sorter: 'select' },
  6: { sorter: 'inputs' }
}

Включены дополнительные синтаксические анализаторы: анализ даты (с Sugar и DateJS), даты ISO8601, месяцы, 2-значные годы, дни недели, расстояние (футы/дюймы и метрические единицы) и формат заголовка (удаляет «A» и «The»).

person James Moberg    schedule 09.09.2013

Вы можете использовать плагин tablesorter jQuery и добавить собственный синтаксический анализатор, способный сортировать все столбцы флажков:

$.tablesorter.addParser({
        id: 'checkbox',
        is: function (s, table, cell) {
            return $(cell).find('input[type=checkbox]').length > 0;
        },
        format: function (s, table, cell) {
            return $(cell).find('input:checked').length > 0 ? 0 : 1;
        },
        type: "numeric"
    });
person domenu    schedule 04.12.2013

Я попробовал несколько подходов в других ответах, но в итоге использовал принятый ответ от salgiza с комментарием Мартина об обновлении модели таблицы. Однако, когда я впервые реализовал это, я установил строку обновления внутри триггера флажка onchange, как предложено в формулировке. Это изменило мои строки при установке / снятии флажка, что я нашел очень запутанным. Линии просто отскакивали от щелчка. Поэтому вместо этого я привязал функцию обновления к фактическому заголовку столбца флажка, чтобы строки менялись только при нажатии для обновления сортировки. Он работает так, как я хочу:

// checkbox-sorter is the assigned id of the th element of the checbox column
$("#checkbox-sorter").click(function(){ 
    $(this).parents("table").trigger("update");
});
person jumps4fun    schedule 02.05.2018

Вы можете добавить собственный парсер в TableSorter, например:

 $.tablesorter.addParser({ 
    // set a unique id 
    id: 'input', 
    is: function(s) { 
        // return false so this parser is not auto detected 
        return false; 
    }, 
    format: function(s) { 
        // Here we write custom function for processing our custum column type 
        return $("input",$(s)).val() ? 1 : 0; 
    }, 
    // set type, either numeric or text 
    type: 'numeric' 
}); 

А затем используйте его в своей таблице

$("table").tablesorter(headers:{0:{sorter:input}});
person Kain Haart    schedule 21.12.2009
comment
Это работает только для динамических таблиц, если вы измените вызов функции формата на function(s, table, node) и используете узел как объект jQuery. См.: ghidinelli.com/ 25.03.2008/ - person Andrew; 09.10.2010

Всего один последний штрих, чтобы завершить ответ Аарона и избежать ошибок переполнения стека. Таким образом, в дополнение к использованию функциональности $.tablesorter.parser(), как описано выше, мне пришлось добавить следующее на свою страницу, чтобы она работала с обновленными значениями флажков во время выполнения.

    var checkboxChanged = false;

    $('input[type="checkbox"]').change(function(){
        checkboxChanged = true;
    });

    // sorterOptions is a variables that uses the parser and disables
    // sorting when needed
    $('#myTable').tablesorter(sorterOptions);
    // assign the sortStart event
    $('#myTable')..bind("sortStart",function() {
        if (checkboxChanged) {
            checkboxChanged = false;
            // force an update event for the table
            // so the sorter works with the updated check box values
            $('#myTable')..trigger('update');
        }
    });
person thanassis    schedule 29.05.2015