无法克隆带有“ .select2不是函数”的<select>错误

时间:2019-12-13 08:07:38

标签: php jquery jquery-select2

我正在尝试以动态形式使用Select2(使用jQuery clone添加新行),但是显然,克隆的行与Select2的功能无关。出现错误

enter image description here

第二个选择菜单已创建,但产生了错误:

Uncaught TypeError: $(...).select2 is not a function

我正在使用此HTML部分:

<tbody id="treatmentlist">
    <tr class="itemData">
        <td>
           {{Form::select('treatments[]',$treatments, null, ['class' => 'form-control treatment', 'placeholder' => 'Select treatment' ])}}
        </td>
        <td><i class="fas fa-plus-circle" id='addRow'><i class="fas fa-minus-circle" id="delRow"></i></td>
    </tr>
</tbody>

这是脚本部分:

@section('scripts')

    <script>
        $(".treatment").select2();
        $("#addRow").on('click', function (e) {
            e.preventDefault();
            var $tr    = $(this).closest('.itemData');
            var $clone = $tr.clone();
            $tr.after($clone);
            $(".treatment").select2();
        });
    </script>

@endsection

已经尝试添加select2('destroy'),但是没有运气。

任何建议如何使新克隆的行保留Select2功能?

2 个答案:

答案 0 :(得分:0)

我无法评论50岁以下的人,希望这个例子对您有所帮助。 解释在这里http://www.phpjavascript.com/2018_03_16_archive.html

$(function () {
    $("#addrow").click(function () {
        var tr = "<tr>" + "<td contenteditable='true'></td>".
                repeat($("#myTable tr:eq(0) td").length) + "</tr>"
        $("#myTable").append(tr);
    });
    $("#addcolumn").click(function () {
        $("#myTable tr").append($("<td contenteditable='true'></td>"));
        $(document).on('click', '.js-del-row', function () {
            $('#myTable').find('tr:last').remove();
        });
        $(document).on('click', '.js-del-column', function () {
            $('#myTable').find('td:last').remove();
        });
    });
});

答案 1 :(得分:0)

显然,该问题与Laravel布局页面(app.blade.php)有关。调用引导程序时,它已经加载了jQuery。因此,在php中,我不需要再次加载jQuery。

因此对app.blade.php进行了修订:

    <!-- Scripts, remove defer from app.js, move selec2.min.js & select2.min.css here -->
    <script src="{{ asset('js/app.js') }}"></script>  
    <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script>

...
...

<!- and adding this part -->  
@yield('scripts')

在php方面,对Select2的更改是:

  1. 使用onClick函数后,请先调用select2('destroy')
  2. 然后克隆包含选择元素的行
  3. 使用select2()在最后一个新添加的元素上最终重新启用Select2。
@section('scripts')
<script>

$(document).ready(function () {
    $("#contents").children("td").children("select").select2();

    $(document).on('click', '#delRow', function(){
        if( $(this).closest('tr').is('tr:only-child') ) {
            alert('cannot delete last row');
        }
        else {
            $(this).closest('tr').remove();
        }

    });

    $("#addRow").click(function () {
        $("#contents").children("td").children("select").select2("destroy").end();

        // add <tr><td> directive first
        var newRow = '<tr id="contents"><td id="trx"><td> <i class="fas fa-minus-circle" id="delRow">';
        $(newRow).appendTo($("#treatmentlist"));

        // append select component on the last tr
        $('#treatmentlist tr:last').children("td:first-child").append(
            // clone the row and insert it in the DOM
            $("#contents").children("td").children("select").first().clone()
        );
        // enable Select2 on the last newly added element
        $('#treatmentlist tr:last').children("td").children("select").select2();
        // enable Select2 on the select elements
        $("#contents").children("td").children("select").select2();
    });
});
</script>
@endsection

在HTML中,按照以下说明应用更改:

                <tbody id="treatmentlist">
                    <tr id="contents">
                        <td id="trx">
                            {{Form::select('treatments[]',$treatments, null, ['class' => 'form-control treatment', 'placeholder' => 'Select treatment' ])}}
                        </td>
                        <td>
                            <i class="fas fa-plus-circle" id='addRow'></td>
                        </td>
                    </tr>
                </tbody>