我正在尝试以动态形式使用Select2
(使用jQuery clone添加新行),但是显然,克隆的行与Select2
的功能无关。出现错误
第二个选择菜单已创建,但产生了错误:
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功能?
答案 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的更改是:
select2('destroy')
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>