
在Web开发中,我们经常需要创建动态表单,允许用户添加或删除多行数据,例如用户列表、商品明细等。为了方便后端接收和处理这些数据,特别是当使用ASP.NET MVC等框架进行模型绑定时,通常会为每个输入元素的id和name属性分配一个递增的索引,例如worker[0].NameSurname、worker[1].NameSurname。
然而,当用户删除中间的某一行时,例如删除了worker[2],剩余的行(如worker[0]、worker[1]、worker[3])的索引就会变得不连续。这会导致以下问题:
因此,在删除动态生成的行后,我们需要一种机制来重新排序所有剩余行的索引,使其保持连续性。
首先,我们来看一个动态添加表单行的典型实现。这个例子使用jQuery在点击按钮时生成新的div块,其中包含输入元素,并为它们分配基于countField变量的递增索引。
立即学习“Java免费学习笔记(深入)”;
let countField = 0; // 初始索引通常从0开始,以匹配数组索引
$("#addUSers").click(function () {
// 构建新的行HTML字符串
var user_row = '<div class="row rm-row">';
user_row += '<div class="col-lg-3 col-md-12 col-sm-12">';
user_row += '<h1></h1>'; // 占位符或行号显示
user_row += '</div>';
user_row += '<div id="workin_user' + countField + '" class="col-lg-9 d-flex gap-1">';
user_row += '<div class="col-lg-5 col-md-5 col-sm-5 col-xs-5 mt-lg-4 mt-md-5">';
user_row += '<fieldset>';
user_row += '<label for="worker_' + countField + '_NameSurname" class="label-text">Name Surname<span class="text-danger"> *</span></label>';
// 注意:这里将asp-for替换为直接的id和name属性,以避免框架特定问题
user_row += '<input class="form-control label-text" id="worker_' + countField + '_NameSurname" name="worker[' + countField + '].NameSurname" type="text" />';
user_row += '</fieldset>';
user_row += '</div>';
user_row += '<div class="col-lg-5 col-md-5 col-sm-5 col-xs-5 mt-lg-4 mt-md-5">';
user_row += '<fieldset>';
user_row += '<label for="worker_' + countField + '_JobDescription"class="label-text">Job Description<span class="text-danger"> *</span></label>';
user_row += '<input class="form-control label-text" id="worker_' + countField + '_JobDescription" name="worker[' + countField + '].JobDescription" type="text" />';
user_row += '</fieldset>';
user_row += '</div>';
user_row += '<div class="col-lg-1 col-md-1 col-sm-2 col-xs-2 mt-lg-4 mt-md-5">';
user_row += '<fieldset>';
user_row += '<label for="deleteWorkRow" class="label-text">DELETE </label>';
user_row += '<button type="button" class="btn btn-danger delete-row-btn"><span class="fa fa-trash"></span></button>'; // 更改ID为类,因为ID应唯一
user_row += '</fieldset>';
user_row += '</div>';
user_row += '</div>';
user_row += '</div>';
$('#inputFieldsContainer').append(user_row);
countField++; // 递增计数器
});说明:
在上面的addUSers点击事件内部,我们通常会绑定一个删除事件。一个简单的删除逻辑可能如下所示:
// 注意:此删除逻辑存在问题,仅作演示
$(document).on('click', '.delete-row-btn', function () {
$(this).closest('.rm-row').remove(); // 删除最近的父行
countField--; // 递减计数器
});局限性分析: 这个简单的删除逻辑虽然能移除DOM中的行并更新countField,但它没有解决核心问题:当删除中间的行时,剩余行的索引不会自动更新。例如,如果有三行索引为0, 1, 2,删除索引为1的行后,剩余的行仍然是0和2,索引不连续。这正是需要索引重排功能的原因。
为了解决索引不连续的问题,我们需要在每次删除操作完成后,遍历所有剩余的行,并根据它们在DOM中的新顺序,重新分配连续的索引。
// 绑定删除按钮的点击事件
$(document).on('click', '.delete-row-btn', function () {
// 1. 删除当前行
$(this).closest('.rm-row').remove();
countField--; // 更新总行数计数器
// 2. 遍历所有剩余的行并重排索引
$('.rm-row').each(function (index) {
var row = $(this); // 获取当前行jQuery对象
// 更新当前行内所有输入元素的id属性
// 查找所有id以"worker["开头的元素
row.find('[id^="worker["]').attr('id', function (i, currentId) {
// 使用正则表达式替换id中的数字索引
// 例如:worker_1_NameSurname 变为 worker_0_NameSurname
return currentId.replace(/_(\d+)_/, '_' + index + '_');
});
// 更新当前行内所有输入元素的name属性
// 查找所有name以"worker["开头的元素
row.find('[name^="worker["]').attr('name', function (i, currentName) {
// 使用正则表达式替换name中的数字索引
// 例如:worker[1].NameSurname 变为 worker[0].NameSurname
return currentName.replace(/\[(\d+)\]/, '[' + index + ']');
});
// 如果有其他需要更新索引的属性,例如label的for属性,也需要在此处处理
row.find('label[for^="worker_"]').attr('for', function (i, currentFor) {
return currentFor.replace(/_(\d+)_/, '_' + index + '_');
});
// 如果有显示行号的元素,也可以在这里更新
// 例如:row.find('h1').text(index + 1);
});
});代码详解:
通过本教程介绍的方法,我们能够有效地解决JavaScript动态表单在删除行后,输入元素索引不连续的问题。核心在于利用jQuery的each()方法遍历剩余行,并结合正则表达式动态更新id和name属性。这种方法确保了表单数据的完整性和后端数据绑定的正确性,是构建健壮动态表单的重要实践。在实际应用中,请根据你的具体命名约定和框架要求,灵活调整选择器和正则表达式。
以上就是JavaScript动态表单:删除行后重排输入元素索引的实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号