【发布时间】:2014-01-25 23:50:09
【问题描述】:
已解决
所以我对sortable() 和connectWith 属性进行了更多研究,发现解决方案比我预期的要简单,但由于draggable() 和droppable(),我在考虑它有点倒退。
这是小提琴:http://jsfiddle.net/DKBU9/12/
原问题如下:
这是我认为应该分开的先前 SO 问题的扩展。
原来的问题在这里:jQuery UI - Clone droppable/sortable list after drop event。它涉及在克隆元素上重新初始化 droppable 处理程序。
不过,最重要的是,我正在尝试允许从初始列表中拖动的元素在可放置列表中进行排序。
这是一个小提琴,基本上说明了原始问题导致的当前行为: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>
JS
$(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
我一直在尝试使用这个 SO question 来解决我的问题,因为结果正是我想要实现的,特别是接受答案的 cmets 中提供的最后一个小提琴,但我似乎无法考虑到细微的差异,弄清楚如何使其适应我的代码。例如,该问题中的小提琴克隆了可拖动元素而不是拖动实际元素,并且与我的不同,它不允许将元素拖回初始列表中。
因此,对于尝试为我的代码获得该结果的任何帮助将不胜感激。
此外,在该示例中,accept 属性设置为返回 true 的函数。这是什么原因?这不只是意味着它会接受任何东西,或任何可拖动的元素吗?
编辑:我读了几个答案,它们只是将 sortable() 与 connectWith 属性一起使用,但由于某种原因,我认为它没有达到我需要的效果,部分原因是我不希望初始列表是可排序的也是。然而,单独使用 sortable() 似乎可以获得我所追求的功能,但我还没有适应所有的事件处理程序。
【问题讨论】:
-
我的回答将允许初始列表不能根据您的编辑进行排序,但如果您可以接受它是可排序的,那么我认为您应该使用您的,因为它更简单。
-
是的,非常感谢您的时间和精力,但我会坚持这一点,因为初始列表是可排序的并不是什么大问题。
标签: jquery jquery-ui jquery-ui-sortable jquery-ui-draggable jquery-ui-droppable