如果您将一些类添加到列中,以便列单元格和关联的标题具有相同的类名,那么利用其他现有的 JavaScript 解决方案并不难。
例如,我使用了这个简单的 JQuery 排序函数并创建了这个 JSFiddle 演示。
我像这样修改了HTML:
<html>
<table id="heading">
<tr>
<th class="name-col">Name</th>
<th class="salary-col">Salary</th>
</tr>
</table>
<table id="data">
<tr>
<td class="name-col">Fred</td>
<td class="salary-col">$12000.00</td>
</tr>
<tr>
<td class="name-col">Kevin</td>
<td class="salary-col">$191200.00</td>
</tr>
</table>
</html>
请注意,我将标题 Name 和该列中的所有单元格与类name-col
进行了比较,并且我对 Salary 标题和包含该类的单元格做了相同的操作salary-col
。
name-col
然后我使用 JQuery 在标题中添加了一个点击侦听器,然后触发了name-col
单元格上的排序功能:
$('th.name-col').click(function() {
$('td.name-col').sortElements(function(a, b){
return $(a).text() > $(b).text() ? 1 : -1;
}, function(){ return this.parentNode; });
});
$('th.salary-col').click(function() {
$('td.salary-col').sortElements(function(a, b){
return $(a).text() > $(b).text() ? 1 : -1;
}, function(){ return this.parentNode; });
});
在这个例子中,sortElements
是我上面链接的简单 JQuery 排序函数中提供的函数。我不是它的作者。
但是,您会注意到此脚本只会排序一次,因为比较器 ( >
) 的方向是硬编码的。一种实现逻辑来反转这种排序的快速n-dirty方法是这样的:
var nameAsc = false;
var salaryAsc = false;
$('th.name-col').click(function() {
$('td.name-col').sortElements(function(a, b){
if (nameAsc) {
nameAsc = false;
return $(a).text() > $(b).text() ? 1 : -1;
} else {
nameAsc = true;
return $(a).text() < $(b).text() ? 1 : -1;
}
}, function(){ return this.parentNode; });
});
$('th.salary-col').click(function() {
$('td.salary-col').sortElements(function(a, b){
if(salaryAsc) {
salaryAsc = false;
return $(a).text() > $(b).text() ? 1 : -1;
} else {
salaryAsc = true;
return $(a).text() < $(b).text() ? 1 : -1;
}
}, function(){ return this.parentNode; });
});
这里的nameAsc
和salaryAsc
布尔变量只是一种允许您反转排序顺序的骇人听闻的方式。>
如果它是上升的,它会翻转比较器函数中的布尔值和方向。可能有一种更有效的方法可以做到这一点,但我只是想举一个简单粗暴的例子。
您的两表模型会遇到很多问题,尤其是在调整列大小时。如果数据表中的单元格中有更长的数据,您的数据列将不再与标题列对齐。我强烈建议您只为标题和数据使用一个表。