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

点击按钮新增含Select2的行时旧行还原为普通HTML的问题求助

问题描述

点击按钮新增一行包含2个Select2组件的行时,新行的Select2能正常初始化,但旧行的Select2会变回普通HTML下拉框。相关代码如下:

HTML代码

<div class="modal fade" role="dialog" id="advanceModal">
    <div class="modal-dialog modal-dialog-centered" role="document" style="max-width: 650px">
        <div class="modal-content">
            <div class="modal-header">
                <h6 class="modal-title">{{ __('tm_absenteeism_data_entry_by_employee_no.label_check_if_activated') }}</h6>
            </div>
            <div class="modal-body">
                <div class="row">
                    <div class="col-5">
                        <select class="form-control advance_label" id="advance_label" name="advance_label" style="width: 100%">
                            <option></option>
                            <option value="GroupCompany">{{ __('tm_absenteeism_data_entry_by_employee_no.label_group_company') }}</option>
                            <option value="Department">{{ __('tm_absenteeism_data_entry_by_employee_no.label_department') }}</option>
                            <option value="Location">{{ __('tm_absenteeism_data_entry_by_employee_no.label_location') }}</option>
                            <option value="WorkingUnit">{{ __('tm_absenteeism_data_entry_by_employee_no.label_working_unit') }}</option>
                            <option value="EmployeeType">{{ __('tm_absenteeism_data_entry_by_employee_no.label_employee_type') }}</option>
                            <option value="KelasCabang">{{ __('tm_absenteeism_data_entry_by_employee_no.label_kelas_cabang') }}</option>
                            <option value="Segmen">{{ __('tm_absenteeism_data_entry_by_employee_no.label_segmen') }}</option>
                            <option value="Position">{{ __('tm_absenteeism_data_entry_by_employee_no.label_position') }}</option>
                            <option value="KlasifikasiJabatan">{{ __('tm_absenteeism_data_entry_by_employee_no.label_klasifikasi_jabatan') }}</option>
                        </select>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <div class="container">
                    <div class="mr-auto float-left">
                        <button type="button" class="btn btn-outline-primary" id="btn_add_filter" style="width: 100px; font-size: 12px;"><i class="fa fa-plus"></i> {{ __('tm_absenteeism_data_entry_by_employee_no.btn_add') }}</button>
                    </div>
                    <div class="float-right">
                        <button type="button" class="btn btn-outline-primary" data-dismiss="modal" style="width: 100px; font-size: 12px;">Cancel</button>
                        <button type="button" class="btn btn-primary" id="btn_apply" style="width: 100px; font-size: 12px;">{{ __('tm_absenteeism_data_entry_by_employee_no.btn_apply') }}</button>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

JavaScript代码

$('#btn_add_filter').click(function() {
        var newRow = '<div class="row">' +
                        '<div class="col-5">' +
                            '<select class="form-control advance_label" id="advance_label" name="advance_label" style="width: 100%">' +
                                '<option></option>' +
                                '<option value="GroupCompany">Group Company</option>' +
                                '<option value="Department">Department</option>' +
                                '<option value="Location">Location</option>' +
                                '<option value="WorkingUnit">Working Unit</option>' +
                                '<option value="EmployeeType">Employee Type</option>' +
                                '<option value="KelasCabang">Kelas Cabang</option>' +
                                '<option value="Segmen">Segmen</option>' +
                                '<option value="Position">Position</option>' +
                                '<option value="KlasifikasiJabatan">Klasifikasi Jabatan</option>' +
                            '</select>' +
                        '</div>' +
                        '<div class="col-1">' +
                            '<div class="box-delete">' +
                                '<i class="fa fa-trash-o"></i>' +
                            '</div>' +
                        '</div>' +
                    '</div>';
        
        $('.modal-body .row:last').after(newRow);

        $('.modal-body .row:last .advance_label').select2({
            placeholder: "Select Filter"
        });

        $('.modal-body .row:last .advance_filter').select2({
            placeholder: "Select Filter"
        });
    }); 
问题原因
  1. 重复ID冲突:HTML要求页面内ID必须唯一,你给所有新增的select都用了id="advance_label",和原始行的ID完全重复,导致DOM查询和Select2初始化时出现逻辑混乱,直接破坏了旧行已生成的Select2实例。
  2. 无效的初始化操作:代码里尝试初始化.advance_filter类的元素,但不管是原始HTML还是新增的行里都没有这个类的元素,属于无意义操作,虽不直接导致旧行失效,但会造成不必要的资源浪费。
  3. 原始行初始化缺失:从代码看,你可能没在页面加载时初始化原始行的Select2,或者后续操作间接覆盖了它。
修复方案

1. 移除重复ID,改用类控制

把所有select的id="advance_label"属性删掉,只保留类名advance_label,确保每个DOM元素都是唯一的。同时给第二个Select2添加对应的类名advance_filter。

2. 修正新增行的HTML结构

补全需求里的第二个Select2组件,并且把name属性改成数组格式(方便表单提交时获取多个值):

var newRow = '<div class="row">' +
                '<div class="col-5">' +
                    '<select class="form-control advance_label" name="advance_label[]" style="width: 100%">' +
                        '<option></option>' +
                        '<option value="GroupCompany">Group Company</option>' +
                        '<option value="Department">Department</option>' +
                        '<option value="Location">Location</option>' +
                        '<option value="WorkingUnit">Working Unit</option>' +
                        '<option value="EmployeeType">Employee Type</option>' +
                        '<option value="KelasCabang">Kelas Cabang</option>' +
                        '<option value="Segmen">Segmen</option>' +
                        '<option value="Position">Position</option>' +
                        '<option value="KlasifikasiJabatan">Klasifikasi Jabatan</option>' +
                    '</select>' +
                '</div>' +
                '<div class="col-5">' +
                    '<select class="form-control advance_filter" name="advance_filter[]" style="width: 100%">' +
                        '<option></option>' +
                        // 这里根据你的需求添加对应的选项
                    '</select>' +
                '</div>' +
                '<div class="col-1">' +
                    '<div class="box-delete">' +
                        '<i class="fa fa-trash-o"></i>' +
                    '</div>' +
                '</div>' +
            '</div>';

3. 正确初始化Select2元素

  • 页面加载完成后,先初始化原始行的Select2:
$(document).ready(function() {
    // 初始化原始行的advance_label
    $('.modal-body .row:first .advance_label').select2({
        placeholder: "Select Filter"
    });
    // 如果原始行有advance_filter,也要初始化
    // $('.modal-body .row:first .advance_filter').select2({ placeholder: "Select Filter" });
});
  • 点击新增按钮时,只针对当前新增的行初始化Select2,避免影响旧行:
$('#btn_add_filter').click(function() {
    var newRow = '...'; // 上面修正后的HTML字符串
    $('.modal-body .row:last').after(newRow);
    
    // 初始化新增行的advance_label
    $('.modal-body .row:last .advance_label').select2({
        placeholder: "Select Filter"
    });
    
    // 初始化新增行的advance_filter
    $('.modal-body .row:last .advance_filter').select2({
        placeholder: "Select Filter"
    });
});

4. 新增删除行的完善逻辑(可选)

给删除按钮添加事件,删除前先销毁对应的Select2实例,避免内存泄漏:

$(document).on('click', '.box-delete', function() {
    // 销毁当前行所有Select2实例
    $(this).closest('.row').find('select').each(function() {
        $(this).select2('destroy');
    });
    // 删除当前行
    $(this).closest('.row').remove();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:15:55