基本上我有一个可拖动项目列表,最初有一个可放置的元素可以拖入它们。将项目拖入droppable时,将克隆droppable(在附加项目之前)并附加为新的可放置区域。
看看这个被剥离的小提琴:http://jsfiddle.net/DKBU9/1/(省略sortable())
HTML
<ul id="draggables">
<li>foo1</li>
<li>foo2</li>
<li>foo3</li>
</ul>
<ul class="droppable new">
</ul>
JS
$('#draggables > li').draggable({
appendTo: 'document',
revert: 'invalid'
});
$('.droppable > li').draggable({
appendTo: 'document',
revert: 'invalid'
});
$('#draggables').droppable({
accept: '.droppable > li',
drop: function(event, ui) {
ui.draggable.detach().css({top: 0,left: 0}).appendTo($(this));
}
});
$('.droppable').droppable({
accept: '#draggables > li',
drop: function(event, ui) {
if($(this).hasClass('new')) {
var clone = $(this).clone(true, true);
$(this).removeClass('new').after(clone);
}
ui.draggable.detach().css({top: 0,left: 0}).appendTo($(this));
}
});
正如您所看到的,拖放适用于初始元素,但不会保留在克隆中。我认为clone(true, true)
复制了匹配的和子元素及其事件处理程序。
我甚至尝试将上面的JS放在函数中并在drop事件中运行该函数,但我什么也没得到。
最终,我希望能够在“池”列表和克隆列表之间以及克隆列表本身之间进行拖放,以及对克隆列表中的项进行排序。
答案 0 :(得分:3)
查看 this fiddle 。
您需要再次设置droppable
事件处理程序。我认为克隆(true)(即数据和事件)会让事情有些混乱。看看this answer。具体做法是:
我认为复制带插件的元素不是很安全 适用于它,除非你100%确定插件的方式 设计和编码可以使用相同的方式支持多个DOM元素 插件实例。
在这种情况下,只需在克隆后添加droppable事件即可。
新功能是:
function initDrop($element)
{
$element.droppable({
accept: '#draggables > li',
drop: function(event, ui) {
if($(this).hasClass('new')) {
var clone = $(this).clone();
$(this).after(clone);
$(this).removeClass('new');
initDrop( clone );
}
ui.draggable.detach().css({top: 0,left: 0}).appendTo($(this));
}
});
}
另请查看this question,它还发现克隆的项目不可删除(如果它对您有用,请查看解决方法)。