已解决
我进一步研究了具有connectWith
属性的sortable()
,发现解决方案比我预期的要简单,但由于draggable()
和droppable()
的原因,我对它的思考方式有些颠倒。
这里是示例:http://jsfiddle.net/DKBU9/12/
以下是原始问题:
这是前面一个SO问题的扩展,我觉得应该保持单独。
原问题在这里:jQuery UI - Clone droppable/sortable list after drop event。它涉及到重新初始化克隆元素上的droppable处理程序。
除此之外,我正在尝试允许从初始列表中拖动的元素在可放置的列表内进行排序。
这里是基本说明当前行为结果的fiddle:http://jsfiddle.net/DKBU9/7/
以及所需的代码,因为SO喜欢抱怨并膨胀这些帖子:
HTML
<ul id="draggables">
<li>foo1</li>
<li>foo2</li>
<li>foo3</li>
</ul>
<ul class="droppable new">
</ul>
JavaScript
$(function() {
$('#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));
cleanUp();
}
});
initDrop($('.droppable'));
});
function initDrop($element) {
$element.droppable({
accept: function(event, ui) {
return true;
},
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));
cleanUp();
}
}).sortable({
items: 'li',
revert: false,
update: function() {
cleanUp();
}
});
}
function cleanUp() {
$('.droppable').not('.new').each(function() {
if($(this).find('li').length == 0) {
$(this).remove();
}
});
}
参考问题:Jquery UI combine sortable and draggable
我一直在尝试使用这个 Stack Overflow 问题解决我的问题,因为答案中提供的结果正是我想要实现的,特别是接受答案评论中提供的最后一个 fiddle,但我似乎无法弄清楚如何根据我的代码进行调整,考虑到细微区别。例如,那个问题中的 fiddle 克隆可拖动的元素而不是拖动实际元素,并且与我的不同,它不允许将元素拖回到初始列表。
因此,任何帮助尝试为我的代码获得该结果将非常感激。
此外,在那个示例中,accept 属性被设置为返回 true 的函数。这样做的原因是什么?这难道不意味着它会接受任何东西,或者任何可拖动元素吗?
编辑:我读了几个答案,只是使用了具有 connectWith 属性的 sortable(),但由于某种原因,我认为它并没有做我需要的事情,部分原因是我不想初始列表也可以排序。然而,仅使用 sortable() 似乎可以获得我想要的功能,但我还没有适应所有事件处理程序。