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

jQuery each循环仅对动态创建的<td>元素执行一次的问题

解决jQuery each循环仅对动态创建执行一次的问题

嘿,我帮你排查一下这个问题,大概率是两个常见坑导致的,咱们一步步来解决:

1. 首先改掉重复的ID!

你代码里给动态生成的<input>和<td>用了id="txtqty"、id="total",这是核心问题之一!ID在整个页面里必须是唯一的,jQuery用$("#txtqty")选择的时候,只会找到第一个匹配的元素,自然each循环只执行一次。

先把HTML生成代码里的ID换成类名:

<tr>
  <td class="col-md-1 text-center">'+sr+'</td>
  <td class="col-md-4 text-center">'+name+'</td>
  <td class="tblprc col-md-1 text-center">'+price+'</td>
  <td class="col-md-2 text-center">
    <div class="form-group">
      <input type="text" class="form-control text-center txtqty" onkeypress="return isNumberKey(event);">
    </div>
  </td>
  <td class="total col-md-1 text-center">0</td>
</tr>

2. 针对动态元素的正确处理方式

如果你的需求是监听每个数量输入框的变化,计算对应行的总价,别用普通的each绑定事件——动态生成的元素在页面加载时不存在,普通事件绑定会失效。要用事件委托绑定到父元素(比如你的表格):

// 假设你的表格id是orderTable,绑定input事件到所有动态生成的.txtqty
$("#orderTable").on("input", ".txtqty", function() {
  // 获取当前输入框所在的行
  const currentRow = $(this).closest("tr");
  // 提取当前行的单价和输入的数量
  const price = parseFloat(currentRow.find(".tblprc").text()) || 0;
  const qty = parseFloat($(this).val()) || 0;
  // 计算并更新总价
  const total = price * qty;
  currentRow.find(".total").text(total.toFixed(2));
});

如果是想在动态添加行之后,批量遍历所有动态生成的<td>(比如初始化总价),要确保在元素生成之后执行each:

// 假设你动态添加行的函数是addRow(),在添加完后执行遍历
function addRow() {
  // 这里是你生成并插入行的代码...
  
  // 遍历所有.total单元格,初始化计算
  $(".total").each(function(index) {
    const row = $(this).closest("tr");
    const price = parseFloat(row.find(".tblprc").text()) || 0;
    const qty = parseFloat(row.find(".txtqty").val()) || 0;
    $(this).text((price * qty).toFixed(2));
  });
}

为什么之前只执行一次?

再帮你复盘下:

  • 重复ID导致jQuery选择器只能匹配第一个元素,each自然只跑一次;
  • 如果是事件绑定时机不对(在元素生成前就绑定),那后续动态添加的元素根本没绑定到事件,看起来就像只执行了一次初始元素的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:29:46