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

使用jQuery汇总表格tr td数据至总字段,动态行添加后旧数据被覆盖求解决

代码中的问题及修正方案

存在的问题:

  • 变量初始化与重置逻辑错误:total_debit_amount定义在事件绑定外部,且每次计算前未重置为0。这会导致每次输入时,都在上一次的计算结果基础上重复累加,而非重新计算所有行的总和,最终出现旧数据被错误覆盖或累加混乱的情况。
  • 条件判断误用赋值运算符:if (total_debit_amount = 0)使用了赋值符号=而非相等判断符号===/==,这会导致条件永远不成立,所有累加逻辑都会走else分支,计算逻辑完全错误。
  • 字符串拼接而非数值求和:input的val()返回字符串类型,直接用+会执行字符串拼接(比如"10"+"20"得到"1020"),而非数值相加,最终得到错误的合计结果。
  • 冗余DOM查询:$(this).closest('tr')完全多余,each回调中的this已经指向当前<tr>元素,无需额外查询。

修正后的代码:

$("#tbody").on("keyup", "input[name^=amtDebit]", function() {
  let total_debit_amount = 0; // 每次计算前重置为0,确保重新统计所有行
  $("tbody tr:not(:first-child)").each(function() {
    // 将输入值转为数值,空值/非数字自动转为0,避免NaN
    let cell_debit_amt = parseFloat($(this).find('td:eq(2) input').val()) || 0;
    total_debit_amount += cell_debit_amt; // 数值累加
  });
  // 可选:保留两位小数,符合金额显示需求
  $('#debit_amount').val(total_debit_amount.toFixed(2));
});

修正说明:

  1. 将total_debit_amount的初始化移到事件内部,每次触发keyup时重置为0,保证每次都重新计算所有行的总和。
  2. 用parseFloat()转换输入值为数值,搭配|| 0处理空值或非数字的情况,避免出现NaN。
  3. 移除错误的条件分支,直接使用累加逻辑简化代码。
  4. 去掉冗余的DOM查询,优化执行效率。
  5. 新增toFixed(2)处理金额小数位(可根据需求调整或移除)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:38:30