假设有一个表格,其中第一行存在合并的单元格,其它行不存在。现在用户希望通过拖拽实现对整个表格的列排序,给个范例
时间: 2024-03-05 21:51:42 浏览: 58
好的,以下是一个基于 HTML 和 JavaScript 的例子,其中演示了如何在表格中实现列排序,包括存在合并单元格的情况。
HTML 代码:
```html
<table id="myTable">
<thead>
<tr>
<th rowspan="2">姓名</th>
<th colspan="2">年龄</th>
<th>成绩</th>
</tr>
<tr>
<th>岁数</th>
<th>月数</th>
<th>分数</th>
</tr>
</thead>
<tbody>
<tr>
<td>张三</td>
<td>20</td>
<td>6</td>
<td>80</td>
</tr>
<tr>
<td>李四</td>
<td>22</td>
<td>10</td>
<td>90</td>
</tr>
<tr>
<td>王五</td>
<td>25</td>
<td>8</td>
<td>85</td>
</tr>
</tbody>
</table>
```
JavaScript 代码:
```javascript
// 获取表格元素
var table = document.getElementById("myTable");
// 获取表头元素
var header = table.querySelector("thead");
// 获取表头行元素
var headerRow = header.querySelector("tr");
// 获取表头单元格元素
var headerCells = headerRow.querySelectorAll("th");
// 定义列排序函数
var sortTable = function(columnIndex, asc) {
// 获取表格主体元素
var body = table.querySelector("tbody");
// 获取表格主体行元素
var bodyRows = body.querySelectorAll("tr");
// 将行元素转换为数组
var rowArray = Array.prototype.slice.call(bodyRows, 0);
// 定义排序函数
var compare = function(row1, row2) {
var cell1 = row1.querySelectorAll("td")[columnIndex];
var cell2 = row2.querySelectorAll("td")[columnIndex];
var value1 = cell1.textContent || cell1.innerText;
var value2 = cell2.textContent || cell2.innerText;
if (asc) {
return value1.localeCompare(value2);
} else {
return value2.localeCompare(value1);
}
};
// 对行数组进行排序
rowArray.sort(compare);
// 将排序后的行重新插入表格主体元素
for (var i = 0; i < rowArray.length; i++) {
body.appendChild(rowArray[i]);
}
};
// 给表头单元格元素添加事件监听器
for (var i = 0; i < headerCells.length; i++) {
headerCells[i].addEventListener("click", function() {
var columnIndex = Array.prototype.indexOf.call(headerCells, this);
var asc = this.getAttribute("data-asc") === "true";
sortTable(columnIndex, asc);
this.setAttribute("data-asc", !asc);
});
}
```
在这个例子中,我们首先获取表格、表头、表头行和表头单元格元素。然后,我们定义了一个用于排序的函数 `sortTable`,该函数接受两个参数:要排序的列的索引和排序顺序(升序或降序)。在函数内部,我们使用 `querySelectorAll` 获取表格主体中的所有行元素,并将它们转换为数组。然后,我们定义了一个比较函数 `compare`,该函数用于比较要排序的列的值。最后,我们使用 `sort` 对行数组进行排序,并将排序后的行重新插入表格主体元素中。
在给表头单元格元素添加事件监听器时,我们使用了一个自定义属性 `data-asc`,用于保存当前排序顺序。当用户单击表头单元格时,我们获取该单元格的索引和当前排序顺序,并调用 `sortTable` 函数进行排序。最后,我们更新 `data-asc` 属性的值,以便下次排序时使用正确的排序顺序。
需要注意的是,此例子中的排序函数仅适用于纯文本内容,如果要排序的列中包含其他类型的内容(例如链接或图像),则需要相应地修改比较函数。此外,该例子中的排序功能仅适用于单列排序,如果需要支持多列排序,则需要相应地修改代码。
阅读全文