克隆的 Select2 没有响应

IT技术 javascript jquery jquery-select2
2021-03-13 06:48:33

我正在尝试克隆包含 select2 工具的行,当我使用 jQuery 克隆该行时,克隆的 select2 没有响应。在下面给出的图像中,第一个原始的 select2 工作正常,但克隆的第二个和第三个 select2 没有响应

代码片段:

$(document).ready(function() {
  var clonedRow = $('.parentRow').clone().html();
  var appendRow = '<tr class = "parentRow">' + clonedRow + '</tr>';
  $('#addRow').click(function() {
    $('#test').after(appendRow);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<tr class="parentRow" id="test">
  <td>
    <g:message code="educationDetails.educationLevel.label" default="Education Level" />
  </td>
  <td>
    <div style="float: left;">
      <g:select name="degree.id" from="${EducationalDegree.list()}" optionKey="id" optionValue="title" noSelection="['': '']" id="degree" value="${cvEducationDetailCO?.degree?.id}" onchange="changeGradeSelectData(this.value)" />
    </div>
    <div>
      <a href="javascript:void(0)" id="addRow">
        <img alt="" title="Add Additional Education Level" src="/static/images
                                                                /top_submit_1.gif">
      </a>
    </div>
  </td>
</tr>

6个回答

在克隆该行之前,您需要通过调用其destroy方法在 select 元素上禁用 Select2

破坏

还原 Select2 对 DOM 所做的更改。通过 Select2 完成的任何选择都将被保留。

http://ivaynberg.github.io/select2/index.html

克隆该行并将其克隆插入 DOM 后,您需要在两个选择元素(原始元素和新克隆的元素)上启用 select2。

这是一个 JSFiddle,展示了如何完成:http : //jsfiddle.net/ZzgTG/

小提琴的代码

HTML

<div id="contents">
    <select id="sel" data-placeholder="-Select education level-">
        <option></option>
        <option value="a">High School</option>
        <option value="b">Bachelor</option>
        <option value="c">Master's</option>
        <option value="c">Doctorate</option>
    </select>
</div>
<br>
<button id="add">add a dropdown</button>

CSS

#contents div.select2-container {
    margin: 10px;
    display: block;
    max-width: 60%;
}

jQuery

$(document).ready(function () {
    $("#contents").children("select").select2();
    $("#add").click(function () {
        $("#contents")
            .children("select")
            // call destroy to revert the changes made by Select2
            .select2("destroy")
            .end()
            .append(
                // clone the row and insert it in the DOM
                $("#contents")
                .children("select")
                .first()
                .clone()
        );
        // enable Select2 on the select elements
        $("#contents").children("select").select2();
    });
});
谢谢详细的解释!注意:通过 select2 移动到适当的 github 组织,小提琴原样被破坏了。您可以通过更新https://select2.github.io/select2/select2-3.3.2/select2.jshttps://select2.github.io/select2/select2-3.3.2/select2.css注意“https”来修复,这(对我来说)可以防止损坏(firefox 阻止 https 页面上的不安全混合内容,如 jsfiddle)。固定小提琴:jsfiddle.net/nxabgfsv
2021-04-28 06:48:33
请注意,此小提琴使用 select2 3.x;在当前的 4.x 系列中,重复 ID ( #sel) 不再有效(它也是无效的 HTML),您需要设置id="",或者更新克隆 ID 为唯一。
2021-04-30 06:48:33
关于小提琴:如果我选择该Master's选项,它会更改为 option Doctorate你可以来看看吗?!
2021-05-04 06:48:33

您必须在克隆之前先销毁 select2,但 .select2('destroy') 不起作用。用这个:

$myClone = $("section.origen").clone();

$myClone.find("span").remove();
$myClone.find("select").select2();

$("div").append($myClone);
超级令人沮丧,但克隆已select2启用<select>,然后cloned.select2("destroy");抛出错误“在未使用 Select2 的元素上调用了 select2('destroy') 方法。”...您的解决方案是唯一适用于我的情况。
2021-04-21 06:48:33

我在尝试动态向表中添加一行时遇到了同样的问题。(该行包含多个 select2 实例。)

我是这样解决的:

function addrow()
{
    var row = $("#table1 tr:last");

    row.find(".select2").each(function(index)
    {
        $(this).select2('destroy');
    }); 

    var newrow = row.clone();       

    $("#table1").append(newrow);

    $("select.select2").select2();
}

诀窍是您需要在克隆行之前分别销毁 .select2 的所有实例。然后克隆后,重新初始化.select2。我希望这也适用于其他人。

谢谢,这在我的用例中有效。另一个要补充的是,我们需要重新初始化 select 的每个实例。
2021-05-13 06:48:33

我实际上已经创建了帐户来回答这个问题,因为我花了一段时间才让它工作。

这在克隆前使用时不起作用: $('.selectpicker').select2('destroy')

但这在我的情况下有效:

$('.selectpicker').select2('destroy');
$('.selectpicker')
    .removeAttr('data-live-search')
    .removeAttr('data-select2-id')
    .removeAttr('aria-hidden')
    .removeAttr('tabindex');

只需删除 select2 添加的所有附加属性。

编辑 #1

好的,似乎您还必须从正在克隆的元素中删除 ID,因为 select2 尝试添加自己的唯一 ID,但当您没有在选择上找到时,它会变得混乱,而 selet2 仅附加在最后一个具有相同 ID 的元素。

@jacvalle - 你救了我的一天!作为 +,如果你有 optgroups,也从那里删除 ids ;)
2021-05-01 06:48:33
我遇到了同样的问题并以几乎相同的方式解决,还必须清除选项项 ID: $(ddls[i]).removeAttr('data-select2-id'); $(ddls[i]).find('option').removeAttr('data-select2-id');
2021-05-09 06:48:33

您必须在克隆之前先销毁所有 select2,例如:

    var div = $("#filterForm div"); 

    //find all select2 and destroy them   
   div.find(".select2").each(function(index)
    {
        if ($(this).data('select2')) {
            $(this).select2('destroy');
          } 
    });

    //Now clone you select2 div 
    $('.filterDiv:last').clone( true).insertAfter(".filterDiv:last"); 

    //we must have to re-initialize  select2 
    $('.select2').select2(); 
这从克隆的选择元素中删除了选项
2021-05-09 06:48:33