如何通过按钮切换HTML表格列位置并恢复?(JS/Angular实现)
纯JavaScript实现方案
实现思路
- 提前保存表格列的原始数据,包括表头文本和每一行对应列的内容
- 用状态变量标记当前表格处于原始状态还是调整后状态
- 点击按钮时切换状态:若为原始状态则重排列,若已调整则恢复原始顺序
代码示例
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>表格列顺序切换</title> <style> button { margin: 10px 0; padding: 8px 16px; cursor: pointer; } table { border-collapse: collapse; margin-top: 10px; } th, td { border: 1px solid #ccc; padding: 8px 12px; } </style> </head> <body> <button id="toggleColBtn">← 切换列顺序</button> <table id="dataTable"> <thead> <tr> <th>姓名</th> <th>年龄</th> <th>城市</th> </tr> </thead> <tbody> <tr> <td>张三</td> <td>25</td> <td>北京</td> </tr> <tr> <td>李四</td> <td>30</td> <td>上海</td> </tr> </tbody> </table> <script> const toggleBtn = document.getElementById('toggleColBtn'); const table = document.getElementById('dataTable'); const theadTr = table.querySelector('thead tr'); const tbodyTrs = Array.from(table.querySelectorAll('tbody tr')); let originalColumns = []; let isSwitched = false; // 保存原始列数据 function saveOriginalColumns() { const thList = Array.from(theadTr.querySelectorAll('th')); thList.forEach((th, colIndex) => { originalColumns.push({ header: th.innerHTML, cells: tbodyTrs.map(tr => tr.querySelectorAll('td')[colIndex].innerHTML) }); }); } // 调整列顺序(示例:将城市列移到最前) function switchColumns() { const reorderedCols = [originalColumns[2], originalColumns[0], originalColumns[1]]; updateTable(reorderedCols); } // 恢复原始列顺序 function restoreOriginalColumns() { updateTable(originalColumns); } // 更新表格内容 function updateTable(columnDataList) { theadTr.innerHTML = ''; columnDataList.forEach(col => { const th = document.createElement('th'); th.innerHTML = col.header; theadTr.appendChild(th); }); tbodyTrs.forEach((tr, rowIndex) => { tr.innerHTML = ''; columnDataList.forEach(col => { const td = document.createElement('td'); td.innerHTML = col.cells[rowIndex]; tr.appendChild(td); }); }); } saveOriginalColumns(); toggleBtn.addEventListener('click', () => { if (isSwitched) { restoreOriginalColumns(); toggleBtn.textContent = '← 切换列顺序'; } else { switchColumns(); toggleBtn.textContent = '→ 恢复原始列顺序'; } isSwitched = !isSwitched; }); </script> </body> </html>
说明
- 你可以修改
switchColumns函数中的列重排逻辑,适配自己的需求 - 状态变量
isSwitched用于控制按钮文本和切换逻辑 - 页面加载时自动保存原始列数据,确保恢复时能精准还原
Angular实现方案
实现思路
- 用数组定义表格的列配置(包含表头文本和数据字段)
- 保存原始列配置的副本,避免引用类型导致的同步修改
- 点击按钮时切换列配置数组:要么使用重排后的数组,要么恢复原始副本
- 借助Angular的数据绑定,修改数组后视图自动更新
代码示例
组件类(table-column-toggle.component.ts)
import { Component, OnInit } from '@angular/core'; interface ColumnConfig { header: string; field: string; } @Component({ selector: 'app-table-column-toggle', templateUrl: './table-column-toggle.component.html', styleUrls: ['./table-column-toggle.component.css'] }) export class TableColumnToggleComponent implements OnInit { columns: ColumnConfig[] = []; originalColumns: ColumnConfig[] = []; isSwitched = false; tableData = [ { name: '张三', age: 25, city: '北京' }, { name: '李四', age: 30, city: '上海' } ]; ngOnInit(): void { this.columns = [ { header: '姓名', field: 'name' }, { header: '年龄', field: 'age' }, { header: '城市', field: 'city' } ]; this.originalColumns = [...this.columns]; } toggleColumnOrder(): void { if (this.isSwitched) { this.columns = [...this.originalColumns]; this.isSwitched = false; } else { this.columns = [ { header: '城市', field: 'city' }, { header: '姓名', field: 'name' }, { header: '年龄', field: 'age' } ]; this.isSwitched = true; } } }
模板文件(table-column-toggle.component.html)
<button (click)="toggleColumnOrder()"> {{ isSwitched ? '→ 恢复原始列顺序' : '← 切换列顺序' }} </button> <table> <thead> <tr> <th *ngFor="let col of columns">{{ col.header }}</th> </tr> </thead> <tbody> <tr *ngFor="let item of tableData"> <td *ngFor="let col of columns">{{ item[col.field] }}</td> </tr> </tbody> </table>
样式文件(table-column-toggle.component.css)
button { margin: 10px 0; padding: 8px 16px; cursor: pointer; } table { border-collapse: collapse; margin-top: 10px; } th, td { border: 1px solid #ccc; padding: 8px 12px; }
说明
- 利用Angular的
*ngFor指令渲染列,无需手动操作DOM - 通过扩展运算符创建原始列配置的副本,保证数据独立性
- 可直接修改
toggleColumnOrder函数中的列顺序,快速适配业务需求
内容的提问来源于stack exchange,提问作者Jose
相关产品推荐
相关产品推荐

