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

如何使用JavaScript或jQuery高效增减系谱表末尾列

系谱表末尾列动态增删方案

原表格结构

<table>
<thead>
  <tr>
    <td rowspan="8">Ancestor 1</td>
    <td rowspan="4">Ancestor 2</td>
    <td rowspan="2">Ancestor 4</td>
    <td>Ancestor 8</td>
  </tr>
  <tr>
    <td>Ancestor 9</td>
  </tr>
  <tr>
    <td rowspan="2">Ancestor 5</td>
    <td>Ancestor 10</td>
  </tr>
  <tr>
    <td>Ancestor 11</td>
  </tr>
  <tr>
    <td rowspan="4">Ancestor 3</td>
    <td rowspan="2">Ancestor 6</td>
    <td>Ancestor 12</td>
  </tr>
  <tr>
    <td>Ancestor 13</td>
  </tr>
  <tr>
    <td rowspan="2">Ancestor 7</td>
    <td>Ancestor 14</td>
  </tr>
  <tr>
    <td>Ancestor 15</td>
  </tr>
</thead>
</table>

需求说明

为上述系谱表高效实现末尾列的添加/删除操作,新增列时单元格数量翻倍,需保留已有数据,支持动态操作。


实现方案

一、添加末尾列

核心思路:通过复制现有行并调整rowspan属性,实现最底层节点的子节点扩展,保证行数量翻倍,末尾列单元格数量翻倍。

原生JavaScript实现

function addColumn() {
  const table = document.querySelector('table thead');
  const rows = Array.from(table.querySelectorAll('tr'));
  // 倒序遍历,避免处理新插入的行
  for (let i = rows.length - 1; i >= 0; i--) {
    const row = rows[i];
    const lastTd = row.lastElementChild;
    // 复制当前行
    const newRow = row.cloneNode(true);
    // 清空新行中除最后一列外的所有单元格
    while (newRow.children.length > 1) {
      newRow.removeChild(newRow.firstElementChild);
    }
    // 设置原行最后一个单元格的rowspan为2
    lastTd.setAttribute('rowspan', 2);
    // 给新行的单元格设置默认内容(可根据需求修改)
    newRow.firstElementChild.textContent = `New Ancestor ${rows.length + i + 1}`;
    // 插入新行到原行之后
    row.after(newRow);
  }
}

jQuery实现

function addColumn() {
  const $rows = $('table thead tr');
  // 倒序遍历
  $rows.get().reverse().forEach(row => {
    const $row = $(row);
    const $lastTd = $row.find('td:last');
    // 复制行并清空多余单元格
    const $newRow = $row.clone().children('td:not(:last)').remove().end();
    // 设置原单元格rowspan
    $lastTd.attr('rowspan', 2);
    // 设置新单元格内容
    $newRow.find('td').text(`New Ancestor ${$rows.length * 2 - $rows.index(row)}`);
    // 插入新行
    $row.after($newRow);
  });
}

二、删除末尾列

核心思路:移除每组行中的第二行,同时取消上一行末尾单元格的rowspan属性,恢复到上一层结构。

原生JavaScript实现

function removeColumn() {
  const table = document.querySelector('table thead');
  const rows = Array.from(table.querySelectorAll('tr'));
  // 若行数为初始值(8),则不删除(可根据需求调整)
  if (rows.length === 8) return;
  // 步长为2,遍历每组的第一行
  for (let i = 0; i < rows.length; i += 2) {
    const row = rows[i];
    const lastTd = row.lastElementChild;
    // 移除rowspan属性
    lastTd.removeAttribute('rowspan');
    // 删除当前行的下一行
    if (rows[i + 1]) {
      rows[i + 1].remove();
    }
  }
}

jQuery实现

function removeColumn() {
  const $rows = $('table thead tr');
  if ($rows.length === 8) return; // 保留初始结构,可按需修改
  // 遍历每组第一行,步长2
  for (let i = 0; i < $rows.length; i += 2) {
    const $row = $rows.eq(i);
    $row.find('td:last').removeAttr('rowspan');
    $rows.eq(i + 1).remove();
  }
}

方案优势

  • 高效性:通过倒序遍历避免重复处理新插入的行,使用DOM直接操作/批量处理减少重排次数;
  • 数据保留:仅调整末尾列相关的单元格和行,原有数据不受影响;
  • 结构合规:严格遵循系谱表的层级关系,保证rowspan属性正确维护表格结构。

内容的提问来源于stack exchange,提问作者user1610333

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:45:18