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

如何检测DataTable列是否正在重排序?解决新增行报错问题

问题描述

爬取亚马逊商品数据时,每获取一件商品就向DataTable新增一行。但在列重排序过程中新增行,会触发“列数不一致”的报错。尝试通过判断table.colReorder.order()的长度是否等于总列数(15)来控制新增时机,但拖动列时该方法仍返回15个元素,无法识别重排序状态,求可行的检测方法。

尝试的核心代码:

if (table.colReorder.order().length == 15) { // 15是总列数
  $("table")
    .DataTable()
    .row.add($(productObjRowHtml(productObj)))
    .draw(); // 添加商品
} else {
  setTimeout(addProduct, 1000, productObj, table); // 延迟后再尝试添加
}

完整代码:

var table = $("table").DataTable(tableDefinition);

function addProduct(ProductObj, table) {
  var tableColumnOrder = getTableColumnOrder(table)
  if (tableColumnOrder.length == 15) {
    $("table")
      .DataTable()
      .row.add($(productObjRowHtml(ProductObj)))
      .draw();
  } else {
    setTimeout(addProduct, 1000, ProductObj, table);
  }

}

function getTableColumnOrder(table) {
  var columnOrder = table.colReorder.order()
  return [...columnOrder]
}
解决方案

利用DataTables ColReorder插件提供的重排序前后事件标记表格状态,是最可靠的检测方式:

  1. 新增全局变量标记重排序状态
var isReordering = false; // 标记是否正在进行列重排序
  1. 绑定ColReorder的起止事件
table.on('colReorder:beforeReorder', function() {
  isReordering = true; // 开始拖动列时标记为正在重排序
});

table.on('colReorder:afterReorder', function() {
  isReordering = false; // 拖动结束、列位置确定后取消标记
});
  1. 修改addProduct函数,通过状态变量判断是否允许新增行
function addProduct(ProductObj, table) {
  if (!isReordering) {
    $("table")
      .DataTable()
      .row.add($(productObjRowHtml(ProductObj)))
      .draw();
  } else {
    setTimeout(addProduct, 300, ProductObj, table); // 缩短延迟间隔,提升响应速度
  }
}

补充说明

  • colReorder:beforeReorder在用户开始拖动列时触发,colReorder:afterReorder在列重排序完成(鼠标松开)时触发,能精准捕捉重排序的起止时机。
  • 拖动过程中colReorder.order()始终包含所有列的索引(仅顺序变化),因此通过长度判断的方式无效,必须依赖事件标记状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:16:06