You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过按钮切换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:45:27