Cloned Select2 не отвечает
Я пытаюсь клонировать строку, которая содержит инструмент select2, когда я клонирую эту строку, используя jQuery, клонированный select2 не отвечает. В приведенном ниже изображении сначала select2, который является оригинальным, работает отлично, но 2-й и 3-й 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>
Ответы
Ответ 1
Прежде чем клонировать строку, вам нужно отключить Select2 в элементе select, вызвав его метод destroy
:
уничтожить
Возвращает изменения в DOM, выполняемые Select2. Любой выбор, сделанный с помощью 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();
});
});
Ответ 2
вам нужно сначала уничтожить select2 перед клонированием, но .select2 ('destroy') не работает.
Используйте это:
$myClone = $("section.origen").clone();
$myClone.find("span").remove();
$myClone.find("select").select2();
$("div").append($myClone);
Ответ 3
вам нужно уничтожить все 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();
Ответ 4
Я решил это, создав другую функцию клона:
jQuery.fn.cloneSelect2 = function (withDataAndEvents, deepWithDataAndEvents) {
var $oldSelects2 = this.is('select') ? this : this.find('select');
$oldSelects2.select2('destroy');
var $clonedEl = this.clone(withDataAndEvents, deepWithDataAndEvents);
$oldSelects2.select2();
$clonedEl.is('select') ? $clonedEl.select2() :
$clonedEl.find('select').select2();
return $clonedEl;
};
Ответ 5
Я решил эту проблему с этим:
Вызов метода уничтожения перед добавлением новой строки
$(".className").select2("destroy"); //Destroy method , connect with class no ID (recomend)
После вызова функции select2 jQuery:
$(".className").select2({
placeholder: "Example",
alowClear:true
});
надеюсь, что это поможет;)
Ответ 6
Я столкнулся с той же проблемой, пытаясь динамически добавить строку в таблицу.
(строка содержит более одного экземпляра 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.
Я надеюсь, что это будет работать и для других.
Ответ 7
Я действительно создал аккаунт, чтобы ответить на это, так как мне потребовалось некоторое время, чтобы заставить его работать.
Это не работает, когда используется перед клонированием: $('.selectpicker').select2('destroy')
Но это работает в моем случае:
$('.selectpicker').select2('destroy');
$('.selectpicker')
.removeAttr('data-live-search')
.removeAttr('data-select2-id')
.removeAttr('aria-hidden')
.removeAttr('tabindex');
Просто удалите все дополнительные атрибуты, которые добавляет select2.
Правка № 1
Итак, похоже, что вы также должны удалить ID из клонируемого элемента, так как select2 пытается добавить свой уникальный идентификатор, когда ни один не найден в select, но когда у вас есть select, он становится беспорядочным, а selet2 присоединяется только к последнему элемент с таким же идентификатором.
Ответ 8
Как использовать код jorar91.
var $clone = $("#multiple_objects_with_select2").cloneSelect2();
$($clone ).find('select').select2({
width:'100%'
});
$("#some_place").append($clone);
Ответ 9
В родительском div не применяйте select2. Сначала клонируйте его и сохраните в переменной, затем примените select2. Позже примените select2 к оригиналу (так как оригинал без select2 уже сохраняется в переменной), а затем примените к вновь созданному селекту. Я пробовал таким образом, и это работает
Ответ 10
Я предлагаю сделать это, это мой простой пример:
function copy_row(id) {
var new_row = $("#"+id+" tbody tr:first").clone();
$("#"+id+" tbody").append('<tr>'+new_row.html()+'</tr>');
$("#"+id+" tbody tr:last input").val('');
$("#"+id+" tbody tr:last select").val('');
$("#"+id+" tbody tr:last input[type='checkbox']").prop('checked', false);
// Initialize
$(".select-remote-address:last, .select-remote-address2:last").select2({
language: {
inputTooShort: function() {
return 'Įveskite...';
}},
ajax: {
url: base_url+"index.php/orders/data/getAddress",
type: 'POST',
dataType: 'json',
delay: 250,
data: function (params) {
return {
q: params.term, // search term
page: params.page
};
},
processResults: function (data, params) {
// parse the results into the format expected by Select2
// since we are using custom formatting functions we do not need to
// alter the remote JSON data, except to indicate that infinite
// scrolling can be used
params.page = params.page || 1;
return {
results: data,
pagination: {
more: (params.page * 30) < data.total_count
}
};
},
cache: true
},
escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
minimumInputLength: 1,
templateResult: formatRepo, // omitted for brevity, see the source of this page
templateSelection: formatRepoSelection // omitted for brevity, see the source of this page
});
$(".select-remote-address:last").last().next().next().remove();
$(".select-remote-address2:last").last().next().next().remove();
// Datetimepicker
jQuery('.date_1:last, .date_2:last').datetimepicker({
i18n:{
lt:{
months:[
'Sausis','Vasaris','Kovas','Balandis',
'Gegužė','Birželis','Liepa','Rugpjūtis',
'Rugsėjis','Spalis','Lapkritis','Gruodis',
],
dayOfWeek:[
"Pir", "An", "Tre", "Ket",
"Pen", "Šeš", "Sek",
]
}
},
format:'Y-m-d H:i',
});
}
Ответ 11
И еще одно решение:
function add_column(copy, paste) {
$("." + copy + ":first").clone().appendTo("." + paste);
$("." + paste + " tr:last input").val('');
$("." + paste + " tr:last select").val('');
// and etc...
// Initialize
$("." + paste + " tr:last select").select2({
language: {
inputTooShort: function() {
return 'Prašome įvesti bent vieną raidę paieškai';
}},
ajax: {
url: base_url+"fuel/Fuel/getWorkersSelect",
type: 'POST',
dataType: 'json',
delay: 250,
data: function (params) {
return {
q: params.term, // search term
page: params.page
};
},
processResults: function (data, params) {
// parse the results into the format expected by Select2
// since we are using custom formatting functions we do not need to
// alter the remote JSON data, except to indicate that infinite
// scrolling can be used
params.page = params.page || 1;
return {
results: data,
pagination: {
more: (params.page * 30) < data.total_count
}
};
},
cache: true
},
escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
minimumInputLength: 1,
templateResult: formatRepo, // omitted for brevity, see the source of this page
templateSelection: formatRepoSelection // omitted for brevity, see the source of this page
});
$("." + paste + " tr:last select").last().next().next().remove();
}
function remove_column(e, paste) {
var how = $("." + paste + " tr").length;
if (how >= 2) {
$(e).parent().parent().remove();
} else {
$("." + paste + " input").val('');
$("." + paste + " select").val('');
// and etc...
}
}
<table class="table table-striped table-bordered">
<thead>
<tr>
<th width="15%">Mašina</th>
<th width="15%">Išduota</th>
<th width="15%">Grąžinta</th>
<th width="20%">Vairuotojas</th>
<th width="10%">Neaktualus</th>
<th width="15%">Perdavimo aktas</th>
<th width="10%">Veiksmai</th>
</tr>
</thead>
<tbody class="paste_place">
<tr class="copy_item">
<td><input type="text" name="masina[]" class="form-control" placeholder="Įveskite..." /></td>
<td><input type="text" name="isduota[]" class="form-control datepicker" placeholder="Įveskite..." /></td>
<td><input type="text" name="grazinta[]" class="form-control datepicker" placeholder="Įveskite..." /></td>
<td>
<select class="form-control select-remote-vairuotojai" name="vairuotojas[]">
<option value="">Pasirinkite iš sąrašo</option>
</select>
</td>
<td><input type="text" name="neaktualus[]" class="form-control" placeholder="Įveskite..." /></td>
<td>haha</td>
<td><a onclick="add_column('copy_item', 'paste_place');"><i style="font-size: 20px;" class="icon-plus-circle2"></i></a> <a onclick="remove_column(this, 'paste_place');"><i style="font-size: 20px; color: red;" class="icon-minus-circle2"></i></a></td>
</tr>
</tbody>
</table>
Ответ 12
Что сработало для меня, чтобы клонировать выбранный ввод, управляемый select2, я сделал следующее:
1. Уничтожить избранный, который клонирован
2. Клон с истинным параметром
3. Удалить из клонов атрибуты "id" и "data-select2-id"
4. Удалите атрибут "data-select2-id" из каждой опции в клоне.
5. Повторно инициализируйте элемент, который был клонирован
6. Инициализируйте клонированный элемент, сбросив значение
Вот пример:
const origin = $('select').last(); // last in case there are more than one select
origin.select2('destroy');
const cloned = origin.clone(true);
cloned.removeAttr('data-select2-id').removeAttr('id');
cloned.find('option').removeAttr('data-select2-id');
origin.select2();
cloned.select2().val(null).trigger('change');