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

jQuery克隆表格<tr>导致Select2组件失效问题咨询

问题:克隆含Select2的表格行后,下拉框失去组件功能

当前场景:

  • 表单内带single-select类的下拉框基于Select2库实现增强功能(滚动选择、搜索等)
  • 通过jQuery克隆表格行时,新克隆的下拉框退化为原生普通下拉,丢失Select2所有增强特性

原表单核心代码(表格行部分)

<table class="table tableDetail">
  <thead>
    <tr>
      <th>Ruangan</th>
      <th>Nama Barang</th>
      <th>Jumlah</th>
      <th>Keterangan</th>
      <th>Aksi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>
        <div class="form-group">
          <select class="single-select" name="id_ruangan[]">
            <!-- 动态生成的选项内容 -->
          </select>
        </div>
      </td>
      <td>
        <div class="form-group">
          <select class="single-select" name="id_barang[]">
            <!-- 动态生成的选项内容 -->
          </select>
        </div>
      </td>
      <!-- 其他表单元素 -->
      <td>
        <div class="form-group">
          <button type="button" class="btn btn-xs btn-primary" id="tambahRow"><i class="fa fa-plus"></i></button>
        </div>
      </td>
    </tr>
  </tbody>
</table>

原克隆逻辑代码

$(document).ready(function() {
    $('#tambahRow').click(function() {
        var clone = $('table.tableDetail tbody tr').first().clone();
        clone.find('input, textarea').val('');
        clone.find('#tambahRow').attr('id', 'deleteRow').removeClass('btn-primary').addClass('btn-danger').html('<i class="fa fa-trash"></i>');
        $('table.tableDetail tbody').append(clone);
    });

    $('table.tableDetail').on('click', '#deleteRow', function() {
        $(this).closest('tr').remove();
    });
});

问题原因分析

  • Select2不是原生DOM组件:它会替换原生<select>元素,生成自定义的HTML结构(带样式的下拉容器、搜索框等),同时给原始元素绑定专属事件和数据。
  • 直接克隆已初始化Select2的行:克隆的只是原生<select>的基础DOM结构,Select2动态生成的增强结构、绑定的事件并不会被复制——这些是初始化后额外添加的,不在原始克隆的DOM范围内。
  • 克隆后的<select>未重新初始化Select2:所以只会显示原生下拉的默认样式,丢失所有增强功能。

解决方案

需要在克隆行后,对新行内的single-select元素重新初始化Select2。推荐两种实现方式:

方式1:临时销毁原始行的Select2再克隆

$(document).ready(function() {
    // 初始化页面上所有Select2
    $('.single-select').select2();

    $('#tambahRow').click(function() {
        var originalRow = $('table.tableDetail tbody tr').first();
        // 临时销毁原始行的Select2,还原为原生select
        originalRow.find('.single-select').select2('destroy');
        
        // 克隆行并重置内容
        var clone = originalRow.clone();
        clone.find('input, textarea').val('');
        clone.find('#tambahRow').attr('id', 'deleteRow').removeClass('btn-primary').addClass('btn-danger').html('<i class="fa fa-trash"></i>');
        
        // 添加克隆行到表格
        $('table.tableDetail tbody').append(clone);
        
        // 重新初始化所有Select2(包括原始行和新克隆行)
        $('.single-select').select2();
    });

    $('table.tableDetail').on('click', '#deleteRow', function() {
        $(this).closest('tr').remove();
    });
});

方式2:使用隐藏模板行(更优)

提前准备一个未初始化Select2的隐藏模板行,克隆后直接初始化新行的Select2,避免反复销毁/重建原始行的组件:

<!-- 新增隐藏的模板行,放在表格外 -->
<div style="display:none;" id="rowTemplate">
  <tr>
    <td>
      <div class="form-group">
        <select class="single-select" name="id_ruangan[]">
          <?php foreach ($dataRuangan as $data) : ?>
          <option value="<?= $data->id_ruangan ?>"><?= $data->nama_ruangan ?></option>
          <?php endforeach; ?>
        </select>
      </div>
    </td>
    <td>
      <div class="form-group">
        <select class="single-select" name="id_barang[]">
          <?php foreach ($dataBarang as $data) : ?>
          <option value="<?= $data->id_barang ?>"><?= $data->nama_barang ?></option>
          <?php endforeach; ?>
        </select>
      </div>
    </td>
    <td>
      <div class="form-group">
        <input type="number" min="1" class="form-control" name="jumlah[]" value="1">
      </div>
    </td>
    <td>
      <div class="form-group">
        <textarea name="keterangan[]" class="form-control"></textarea>
      </div>
    </td>
    <td>
      <div class="form-group">
        <button type="button" class="btn btn-xs btn-danger deleteRow"><i class="fa fa-trash"></i></button>
      </div>
    </td>
  </tr>
</div>

对应的JS代码:

$(document).ready(function() {
    // 初始化页面上的Select2
    $('.single-select').select2();

    $('#tambahRow').click(function() {
        // 克隆模板行
        var clone = $('#rowTemplate tr').clone();
        // 添加到表格
        $('table.tableDetail tbody').append(clone);
        // 单独初始化新行的Select2
        clone.find('.single-select').select2();
    });

    $('table.tableDetail').on('click', '.deleteRow', function() {
        $(this).closest('tr').remove();
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:56:01