为了学习如何更有效地做到这一点,我很好奇任何关于如何改进这一点的想法,或者我是否一起走错了路。
到目前为止,我已经写了,http://jsfiddle.net/mstefanko/LEjf8/9/
这基本上可以小规模处理我想要的。
有一些错误,我一点也不相信这是可以写的那么好,可能是一个不尝试锁定 jquery ui 可排序的白痴。但是由于需要在没有简单的项目列表的情况下执行此操作,并且希望将其扩展为包括多个拖放,我想至少了解我需要做些什么来实现这一点,即使它只是为了学习如何像这些工作的排序功能。
问题孩子,
这一切都在一个调用 droppable() 的 over 事件的函数中
我有一系列空位
var emptyHolders = [];
$('.pipeline-holder').each(function(){
if($(this).hasClass('holder-empty')){
var eid = $(this).attr('id');
emptyHolders.push(eid.substring(14));
}
});
cid 是你在上面的可放置元素,所以我找到下一个打开的插槽使用
for (var i = 0; i < emptyHolders.length; i++) {
var currentEmpty = emptyHolders[i];
if (currentEmpty > cid) {
nextEmpty = currentEmpty;
i = emptyHolders.length;
} else {
prevEmpty = parseInt(currentEmpty);
}
}
如果列表下方有一个空槽,我使用 for 循环循环移动 DOM 周围的项目,以腾出放置元素所需的空间。
if (nextEmpty != null) {
var moveMe = nextEmpty -1;
for (var i = moveMe; i >= cid; i--) {
var nextcount = i + 1;
var me = $('#pipeline-rank-' + i);
var next = $('#pipeline-rank-' + i).parents('.pipeline-rank-row').next().find('.pipeline-holder');
var pid = $('#pipeline-rank-' + i).find('.content-wrapper').attr('id');
next.append($('#pipeline-rank-' + i).find('.content-wrapper'));
next.removeClass('holder-empty');
next.siblings('.remember-my-position-hover').html(pid);
}
$('#pipeline-rank-' + cid).addClass('holder-empty');
}
如果列表下方没有一个,我会反向执行相同的操作,以检查 droppable 上方是否有一个点可以将项目向上推入。
任何想法都非常感谢!