Итак, поиграв с вашим кодом, вот вывод, к которому я пришел.
Похоже, что перетаскиваемый метод jqueryui отслеживает свои объекты отдельно.Когда вы клонируете, это отслеживание не клонируется.Я изменил ваш код следующим образом:
jQuery.fn.swapWith = function(to) {
return this.each(function() {
var copy_to = $(to).clone(true).appendTo($("#wrapper"));
var copy_from = $(this).clone(true).appendTo($("#wrapper"));
//$(to).replaceWith(copy_from);
//$(this).replaceWith(copy_to);
});
};
Вы можете увидеть захватывающие результаты http://jsfiddle.net/XkUDv/16/
Как вы можете видеть, если вы перетаскиваете новые клонированные объекты, он перемещает оригинал, а неклонированный.
Это не ответ, но я надеюсь, что это поможет.
ОБНОВЛЕНИЕ:
после более внимательного изучения клона я изменил javascript на:
<script type="text/javascript">
jQuery.fn.swapWith = function(to) {
return this.each(function() {
var copy_to = $(to).clone();
var copy_from = $(this).clone();
$(to).replaceWith(copy_from);
$(this).replaceWith(copy_to);
});
};
$(document).ready(function() {
options = { revert: true };
$("li").draggable(options);
$('#wrapper').droppable({
drop: function(event, ui) {
window.setTimeout(function(){
$('#one').swapWith($('#two'));
$("li").draggable(options);
}, 600);
}
});
});
</script>
Теперь все работает так, как вы хотели:)
Я предполагаю, что проблема в том, что, поскольку clone (true) копирует обработчики событий, когда вы пытаетесь присоединить перетаскиваемый объект к новомуклонирует он видит старые обработчики событий и игнорирует элементы.Поэтому вместо clone (true) я изменил его на clone ();
надеюсь, это поможет!
Рабочая версия: http://jsfiddle.net/XkUDv/21/