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

动态添加表格行后根据身份证号计算年龄的逻辑异常修复问题

问题原因

  • 事件重复绑定:每次点击新增行按钮时,都会给页面中所有带.noic类的输入框重新绑定一次blur事件,新增n行后第一行的blur事件会被绑定n次,触发时会执行n次逻辑
  • 选择器范围错误:直接用$(".noic")和$(".age")选择元素,会选中页面中所有匹配类名的输入框,取值时取到第一个输入框的值,赋值时也会给所有输入框赋值,自然会全量覆盖

修复方案

把原来写在新增行逻辑里的blur事件绑定移除,换成事件委托的方式绑定在表格容器上,同时触发事件时通过$(this)定位当前触发事件的输入框,仅修改当前行对应的年龄输入框。

修改后的完整JS代码如下:

var num = 0;
// 新增表格行
$('#addBtn').on('click', function() {
  $('#tbody').append(`<tr id="${++num}">
             <td class="row-index text-center">
             <p>${num}</p>
             </td>
             <td class="row-index text-center">
             <input type="text" class="form-control name">
             </td>
             <td class="row-index text-center">
             <input type="text" class="form-control noic">
             </td>
             <td class="row-index text-center">
             <input type="text" class="form-control age">
             </td>
              <td class="text-center">
                <button class="btn btn-danger remove"
                  type="button"><span class="glyphicon glyphicon-minus"></span></button>
                </td>
              </tr>`);
});

// 用事件委托绑定身份证号输入框的blur事件,动态新增的元素也能生效
$('#tbody').on('blur', '.noic', function() {
  var currentYear = new Date().getFullYear().toString().substr(-2);
  var yearNow = new Date().getFullYear();
  // 取当前触发事件的身份证号输入框的值
  var yearID = $(this).val().substring(0, 2);
  var age;
  if (yearID > currentYear) {
    age = (+yearNow - (+1900 + +yearID));
  } else {
    age = (+yearNow - (+2000 + +yearID));
  }
  // 仅给当前行的年龄输入框赋值
  $(this).closest('tr').find('.age').val(age);
});

// 删除表格行
$('#tbody').on('click', '.remove', function() {
  var child = $(this).closest('tr').nextAll();
  child.each(function() {
    var id = $(this).attr('id');
    var idx = $(this).children('.row-index').children('p');
    var dig = parseInt(id.substring(1));
    idx.html(`${dig - 1}`);
    $(this).attr('id', `${dig - 1}`);
  });
  $(this).closest('tr').remove();
  num--;
});

补充说明

事件委托是把事件绑定到固定存在的父容器上,通过事件冒泡机制匹配触发事件的子元素,非常适合动态新增元素的场景,不需要每次新增元素都重复绑定事件,性能也更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:27:02