Как дублировать элемент при использовании jQuery sortable?
Я использую этот метод http://jqueryui.com/demos/sortable/#connect-lists чтобы соединить два списка, которые у меня есть. Я хочу иметь возможность перетаскивать из списка A в список B, но когда элемент будет удален, мне нужно сохранить исходный элемент в списке A. Я проверил параметры и события, но я считаю, что ничего подобного нет. Какие-нибудь подходы?
6 ответов:
для начала посмотри, и читать @Erez ответ тоже.
$(function () { $("#sortable1").sortable({ connectWith: ".connectedSortable", remove: function (event, ui) { ui.item.clone().appendTo('#sortable2'); $(this).sortable('cancel'); } }).disableSelection(); $("#sortable2").sortable({ connectWith: ".connectedSortable" }).disableSelection(); });
$("#sortable1").sortable({ connectWith: ".connectedSortable", forcePlaceholderSize: false, helper: function (e, li) { copyHelper = li.clone().insertAfter(li); return li.clone(); }, stop: function () { copyHelper && copyHelper.remove(); } }); $(".connectedSortable").sortable({ receive: function (e, ui) { copyHelper = null; } });
решение Erez работает для меня, но я обнаружил, что его отсутствие инкапсуляции расстраивает. Я бы предложил использовать следующее решение, чтобы избежать использования глобальных переменных:
$("#sortable1").sortable({ connectWith: ".connectedSortable", helper: function (e, li) { this.copyHelper = li.clone().insertAfter(li); $(this).data('copied', false); return li.clone(); }, stop: function () { var copied = $(this).data('copied'); if (!copied) { this.copyHelper.remove(); } this.copyHelper = null; } }); $("#sortable2").sortable({ receive: function (e, ui) { ui.sender.data('copied', true); } });
вот jsFiddle:http://jsfiddle.net/v265q/190/
$("#sortable2, #sortable1").sortable({ connectWith: ".connectedSortable", remove: function (e, li) { copyHelper = li.item.clone().insertAfter(li.item); $(this).sortable('cancel'); return li.clone(); } }).disableSelection();
ответ abuser2582707 работает лучше всего для меня. Кроме одной ошибки: вам нужно изменить возврат на
return li.item.clone();
так и должно быть:
$("#sortable2, #sortable1").sortable({ connectWith: ".connectedSortable", remove: function (e, li) { li.item.clone().insertAfter(li.item); $(this).sortable('cancel'); return li.item.clone(); } }).disableSelection();
при использовании решения Erez, но для подключения 2 сортируемых портлетов (основой был пример кода портлета из http://jqueryui.com/sortable/#portlets), переключатель на клоне не будет работать. Я добавил следующую строку перед ' return li.clone ();', чтобы заставить его работать.
copyHelper.click(function () { var icon = $(this); icon.toggleClass("ui-icon-minusthick ui-icon-plusthick"); icon.closest(".portlet").find(".portlet-content").toggle(); });
это заняло у меня некоторое время, чтобы выяснить, так что я надеюсь, что это поможет кому-то.