【发布时间】:2018-05-09 05:53:01
【问题描述】:
我正在使用来自 W3Schools 的 this code 通过单击列标题对所有表行进行排序。正如预期的那样,这将按该 col 值对所有行进行排序。
我确信这已经在某个地方得到了回答,但我通过单击第一列行来过滤搜索结果以找到类似的列排序方式(希望在纯 javascript 中)对我来说并不困难。
这应该按点击的行值对所有列进行排序。
我希望有一些组合方法可以根据用户点击按列和行排序,但只是按行排序 方法就可以了。
提前感谢!
预期行为
未排序的表:
<table id="myTable">
<tbody>
<tr>
<th onclick="sortTableRows(0)">Name</th>
<th onclick="sortTableRows(1)">Col 1</th>
<th onclick="sortTableRows(2)">Col 2</th>
<th onclick="sortTableRows(3)">Col 3</th>
</tr>
<tr>
<td onclick="sortTableCols(1)">Alan Brado</td>
<td>2</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td onclick="sortTableCols(2)">Kevin Chuca</td>
<td>1</td>
<td>3</td>
<td>2</td>
</tr>
<tr>
<td onclick="sortTableCols(3)">Pamela Chu</td>
<td>3</td>
<td>2</td>
<td>1</td>
</tr>
</tbody>
</table>
NORMAL:按 COLUMN(第 1 列)排序的表格:
<table id="myTable">
<tbody>
<tr>
<th onclick="sortTableRows(0)">Name</th>
<th onclick="sortTableRows(1)">*Col 1*</th>
<th onclick="sortTableRows(2)">Col 2</th>
<th onclick="sortTableRows(3)">Col 3</th>
</tr>
<tr>
<td onclick="sortTableCols(1)">Kevin Chuca</td>
<td>1</td>
<td>3</td>
<td>2</td>
</tr>
<tr>
<td onclick="sortTableCols(1)">Alan Brado</td>
<td>2</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td onclick="sortTableCols(3)">Pamela Chu</td>
<td>3</td>
<td>2</td>
<td>1</td>
</tr>
</tbody>
</table>
DESIRED:按 ROW 排序的表格(Alan Brado):
<table id="myTable">
<tbody>
<tr>
<th onclick="sortTableRows(0)">Name</th>
<th onclick="sortTableRows(1)">Col 3</th>
<th onclick="sortTableRows(2)">Col 1</th>
<th onclick="sortTableRows(3)">Col 2</th>
</tr>
<tr>
<td onclick="sortTableCols(1)">*Alan Brado*</td>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td onclick="sortTableCols(2)">Kevin Chuca</td>
<td>2</td>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td onclick="sortTableCols(3)">Pamela Chu</td>
<td>1</td>
<td>3</td>
<td>2</td>
</tr>
</tbody>
</table>
这是我的sn-p:
function sortTableRows(n) {
var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
table = document.getElementById("myTable");
switching = true;
dir = "asc";
while (switching) {
switching = false;
rows = table.getElementsByTagName("TR");
for (i = 1; i < (rows.length - 1); i++) {
shouldSwitch = false;
x = rows[i].getElementsByTagName("TD")[n];
y = rows[i + 1].getElementsByTagName("TD")[n];
if (dir == "asc") {
if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
shouldSwitch= true;
break;
}
} else if (dir == "desc") {
if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
shouldSwitch= true;
break;
}
}
}
if (shouldSwitch) {
rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
switching = true;
switchcount ++;
} else {
if (switchcount == 0 && dir == "asc") {
dir = "desc";
switching = true;
}
}
}
}
function sortTableCols(n) {
alert("This should sort cols by row #"+n+" values");
}
/* Just for beauty */
#myTable {
border: none;
}
#myTable th {
cursor: pointer;
width: 5%;
border: none;
background-color: #e0e0e0;
}
#myTable tr td {
border: none;
border-bottom: 1px solid #aaa;
text-align: center;
}
#myTable tr td:first-child {
cursor: pointer;
background-color: #e0e0e0;
border-bottom: 1px solid #aaa;
text-align: center;
}
#myTable tr:last-child td {
border: none;
}
<table id="myTable">
<tbody>
<tr>
<th onclick="sortTableRows(0)">Name</th>
<th onclick="sortTableRows(1)">Col 1</th>
<th onclick="sortTableRows(2)">Col 2</th>
<th onclick="sortTableRows(3)">Col 3</th>
</tr>
<tr>
<td onclick="sortTableCols(1)">Alan Brado</td>
<td>2</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td onclick="sortTableCols(2)">Kevin Chuca</td>
<td>1</td>
<td>3</td>
<td>2</td>
</tr>
<tr>
<td onclick="sortTableCols(3)">Pamela Chu</td>
<td>3</td>
<td>2</td>
<td>1</td>
</tr>
</tbody>
</table>
【问题讨论】:
-
请注意,W3Schools 不是 W3。没有隶属关系。
-
已编辑,谢谢。我很困惑。
-
对 1 行进行排序意味着对所有行进行排序,因为它会更改列顺序。
-
是的,我知道。第一列是“行标题”......所以?
标签: javascript html html-table