我正在寻找一种方法来排除使用jQuery的tablesorter插件排序单个列。具体来说,我有一个相当大的表,并希望保持一个“行号”列固定,以便在排序后很容易看到表中特定行的位置。
例如:
# name
-----------
1 papaya
2 apple
3 strawberry
4 banana
在名称列上排序时,应该产生:
# name
-----------
1 apple
2 banana
3 papaya
4 strawberry
感谢。
答案 0 :(得分:30)
对于那些在寻找排除列可排序的方法(即列上的可点击标题)时发现这种情况的人,下面的示例将第4列(零索引)排除在排序之外:
$("table").tablesorter({
headers: {4: {sorter: false}}
});
答案 1 :(得分:18)
您可以使用以下小部件来完成您的目标:
$(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)
编辑:我在http://jsbin.com/igupu4/3制作了这项技术的样本。单击任何列标题进行排序...
虽然我对你关于jquery的问题没有答案,但是这里有另一种获取你在此描述的特定行为的方法,在排序后修复了行号。 (使用CSS,特别是content property和counter related properties/functions。)
<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:在样本1之前。(Mozilla only supports this in trunk for now...)
在示例2中,您可以看到如何将行号列放在任何位置,而不仅仅是在第一列中。
答案 3 :(得分:3)
这会跳过第一列的排序,并允许第二列排序。只需为从第一列开始为零的所有列设置true / false。
<script>
$(document).ready(function() {
$("table").tablesorter({
headers: {
0: {sorter: false},
1: {sorter: true},
3: {sorter: false}
}//headers
});
});
</script>
答案 4 :(得分:3)
$("table").tablesorter({
headers: {4: {sorter: false},8: {sorter: false}}
});
答案 5 :(得分:2)
Brian Fisher的答案是正确的,但在大表中它太慢了(在我的例子中是+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 :(得分:0)
槽糕。从tablesorter的重组表的方法来看,我很确定这不是完全可能的。 Tablesorter将每个tr逐个拉出DOM并根据索引字段对它们进行排序,重新插入整个tr而不以任何方式更改tr的内容。然后,您所请求的解决方案需要在每次排序后重复遍历表并重新枚举第一列。 Tablesorter确实有一个插件方法,由zebrastripe和其他扩展使用。也许这可以用来挂钩排序方法?
答案 7 :(得分:0)
Stobor的答案是完美的。唯一的问题是需要等到表完全呈现以放置数字。
一些观察结果:
注意: Abdul显示的方法仅限制用户按指示的列进行排序,但是当选择其他非限制列的订单时,他的内容始终与行的其余部分一起排序。
答案 8 :(得分:0)
只是对这个问题的更新。虽然投票最高的答案是一个很好的解决方案,但 jstablesorter 团队添加了此功能,因此在您的 html 单元格中添加以下属性:
data-sorter="false"
这是一种禁止任何标题进行排序的无缝方式。