Исключить сортировку столбца с помощью jQuery tablesorter
Я ищу способ исключить сортировку одного столбца с помощью плагина jQuery tablesorter. В частности, у меня довольно большая таблица, и я бы хотел, чтобы столбец "номер строки" был исправлен, так что легко видеть, какая позиция в таблице является определенной строкой после сортировки.
Например:
# name
-----------
1 papaya
2 apple
3 strawberry
4 banana
При сортировке по столбцу имени следует:
# name
-----------
1 apple
2 banana
3 papaya
4 strawberry
Спасибо.
Ответы
Ответ 1
Вот виджет, который вы можете использовать, который выполнит то, что вы ищете:
$(function() {
// add new widget called indexFirstColumn
$.tablesorter.addWidget({
// give the widget a id
id: "indexFirstColumn",
// format is called when the on init and when a sorting has finished
format: function(table) {
// loop all tr elements and set the value for the first column
for(var i=0; i < table.tBodies[0].rows.length; i++) {
$("tbody tr:eq(" + i + ") td:first",table).html(i+1);
}
}
});
$("table").tablesorter({
widgets: ['zebra','indexFirstColumn']
});
});
Ответ 2
Для тех, кто находит это, ища способ исключить сортировку столбца (т.е. заголовок с кликом в столбце), приведенный ниже пример исключает сортировку столбца 4 (с нулевой индексацией):
$("table").tablesorter({
headers: {4: {sorter: false}}
});
Ответ 3
Изменить: я сделал образец этой техники в http://jsbin.com/igupu4/3. Щелкните любой заголовок столбца для сортировки...
Пока у меня нет ответа на ваш вопрос о jquery, здесь альтернативный способ получить конкретное поведение, которое вы описали здесь, фиксированные номера строк после сортировки. (Использование CSS, в частности свойство контента, и свойства, связанные с счетчиком/функции.)
<html>
<head>
<title>test</title>
<style type="text/css">
tbody tr
{
counter-increment : rownum ;
}
tbody
{
counter-reset: rownum;
}
table#sample1 td:first-child:before
{
content: counter(rownum) " " ;
}
table#sample2 td.rownums:before
{
content: counter(rownum) ;
}
</style>
<script src="jquery-1.2.6.min.js" ></script>
<script src="jquery.tablesorter.min.js" ></script>
<script>
$(document).ready(function()
{
$("table").tablesorter();
}
);
</script>
</head>
<body>
<table id="sample1">
<thead>
<tr>
<th>Col 1</th>
<th>Col 2</th>
</thead>
<tbody>
<tr>
<td>
<p>foo</p>
</td>
<td>
<p>quuz</p>
</td>
</tr>
<tr>
<td>bar</td>
<td>quux</td>
</tr>
<tr>
<td>baz</td>
<td>baz</td>
</tr>
</tbody>
</table>
<table id="sample2">
<thead>
<tr>
<th>Rownums</th>
<th>Col 1</th>
<th>Col 2</th>
<th>More Rownums</th>
</thead>
<tbody>
<tr>
<td class="rownums"></td>
<td>
<p>foo</p>
</td>
<td>
<p>bar</p>
</td>
<td class="rownums"></td>
</tr>
<tr>
<td class="rownums"></td>
<td>quuz</td>
<td>baz</td>
<td class="rownums"></td>
</tr>
<tr>
<td class="rownums"></td>
<td>fred</td>
<td>quux</td>
<td class="rownums"></td>
</tr>
</tbody>
</table>
</body>
</html>
Если ваш браузер достаточно совместим с CSS2.1, вы можете использовать tr: before вместо td: first-child: before в примере 1. (Mozilla только поддерживает это в trunk на данный момент...)
В примере 2 вы можете увидеть, как разместить столбцы номера строки в любом месте, а не только в первом столбце.
Ответ 4
Это будет пропускать сортировку для первого столбца и разрешить ее для второго. Просто установите true/false для всех столбцов, начиная с первого столбца, как ноль.
<script>
$(document).ready(function() {
$("table").tablesorter({
headers: {
0: {sorter: false},
1: {sorter: true},
3: {sorter: false}
}//headers
});
});
</script>
Ответ 5
Ответ Брайана Фишера правильный, но он слишком медленный в больших таблицах (+1600 строк в моем примере). Я улучшил путь итерации по всем строкам. Все остальное одно и то же.
$(function() {
// add new widget called indexFirstColumn
$.tablesorter.addWidget({
// give the widget a id
id: "indexFirstColumn",
// format is called when the on init and when a sorting has finished
format: function(table) {
// loop all tr elements and set the value for the first column
$(table).find("tr td:first-child").each(function(index){
$(this).text(index+1);
})
}
});
$("table").tablesorter({
widgets: ['zebra','indexFirstColumn']
});
});
Ответ 6
$("table").tablesorter({
headers: {4: {sorter: false},8: {sorter: false}}
});
Ответ 7
Хмм. Из метода ретрансляции таблицы tablesorter я уверен, что это невозможно. Tablesorter перемещает каждый tr из DOM один за другим и сортирует их на основе индексированного поля, повторно вставляя весь tr без изменения содержимого tr любым способом. Затем ваше запрошенное решение должно повторить повторение по таблице после каждого сортировки и повторное перечисление первого столбца. Tablesorter имеет метод плагина, который используется zebrastripe и другими расширениями. Возможно, это можно использовать для подбора методов сортировки?
Ответ 8
Ответ Стобора идеален. Единственная проблема заключается в том, что нужно подождать, пока таблица не будет полностью отображена, чтобы поместить числа.
Некоторые наблюдения:
- Вам нужно указать пустой столбец, чтобы этот метод поместил числа.
- Если у вас есть заголовки в таблице, вы должны использовать теги THEAD и TBODY, чтобы позволить tablesorter сортировать только данные в разделе TBODY.
- Если у вас есть нижний колонтитул в ваших таблицах, вы должны разрешить это из секции TBODY, чтобы избежать сортировки его содержимого, а также использовать тэги TH вместо TD, чтобы избежать нумерации нижнего колонтитула.
Примечание:
Метод, показанный Abdul, ограничивает пользователя сортировкой по указанным столбцам, но его содержимое всегда упорядочивается вместе с остальной частью строки, когда выбран порядок с помощью другого неограниченного столбца.