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

jQuery实现:仅当所有已有字段填满时自动添加表格行

解决表格自动无限添加行的问题

你的代码现在会无限添加行,核心问题有两个:一是监听了整个表单的change事件,新行添加后输入内容又会触发事件;二是只检查了textarea是否有值,没有验证最后一行的所有必填字段是否都填写完成。

下面是修正后的代码,实现仅当表格最后一行的所有可输入字段(除了只读的最终金额)都填写完毕时,才自动添加新行:

修改后的JavaScript代码

$(document).ready(function() {
  var count = 1;
  // 只监听表格内可输入元素的change事件
  $('#invoice-item-table').on('change', 'textarea, input:not([readonly])', function() {
    // 获取表格最后一行的所有可输入控件
    var lastRow = $('#invoice-item-table tr:last');
    var inputs = lastRow.find('textarea, input:not([readonly])');
    var allFilled = true;

    // 遍历检查每个输入框是否都有有效内容
    inputs.each(function() {
      // 去除首尾空格后判断是否为空
      if ($.trim($(this).val()) === '') {
        allFilled = false;
        return false; // 发现空值就停止遍历
      }
    });

    // 只有所有字段填完,且下一行还未创建时才添加新行
    if (allFilled && $('#row_id_' + (count + 1)).length === 0) {
      count++;
      $('#total_item').val(count);
      var html_code = '';
      html_code += '<tr id="row_id_' + count + '">';
      html_code += '<td><span id="sr_no">' + count + '</span></td>';
      html_code += '<td><span class="pull-left"><a href="#addnew" data-toggle="modal" class="btn btn-info btn-sm"><span class="glyphicon glyphicon-plus"></span>+</a></span></td>';
      html_code += '<td><textarea cols="200" rows="20" name="item_name[]" id="item_name' + count + '" class="form-control"></textarea></td>';
      html_code += '<td><input type="number" name="order_item_quantity[]" id="order_item_quantity' + count + '" data-srno="' + count + '" class="form-control" /></td>';
      html_code += '<td><input type="number" name="order_item_price[]" id="order_item_price' + count + '" data-srno="' + count + '" class="form-control" /></td>';
      html_code += '<td><input type="number" name="order_item_final_amount[]" id="order_item_final_amount' + count + '" data-srno="' + count + '" readonly class="form-control" /></td>';
      html_code += '<td><button type="button" name="remove_row" id="' + count + '" class="btn btn-danger btn-xs remove_row">X</button></td>';
      html_code += '</tr>';
      $('#invoice-item-table').append(html_code);
    }
  });
});

关键改动说明

  • 缩小事件监听范围:不再监听整个表单的change,只针对表格内的可输入元素,避免无关操作触发添加逻辑。
  • 只验证最后一行:每次仅检查当前最后一行的所有必填字段,确保用户填完当前行才会新增下一行。
  • 防止重复添加:通过判断下一行的DOM元素是否存在,避免同一行填完后多次触发事件导致重复加行。
  • 严格空值判断:用$.trim()去除输入内容的首尾空格,避免用户输入空格被误判为已填写。

对应的HTML代码(无需修改,保留原结构即可)

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<tbody id="invoice-item-table">
  <tr id="row_id_1">
    <td><span id="sr_no">1</span></td>
    <td><span class="pull-left"><a href="#addnew" data-toggle="modal" class="btn btn-info btn-sm"><span class="glyphicon glyphicon-plus"></span>+</a>
      </span>
    </td>
    <td><textarea cols="200" rows="20" name="item_name[]" id="item_name1" class="form-control" autofocus></textarea></td>
    <td><input type="number" name="order_item_quantity[]" id="order_item_quantity1" data-srno="1" class="form-control" /></td>
    <td><input type="number" min="1" step="any" name="order_item_price[]" id="order_item_price1" data-srno="1" class="form-control" /></td>
    <td><input type="number" min="1" step="any" name="order_item_final_amount[]" id="order_item_final_amount1" data-srno="1" readonly class="form-control" /></td>
    <th/>
  </tr>
</tbody>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:50:51