これをより効率的に行う方法を学ぶために、これを改善する方法や、間違った道を一緒に歩いているかどうかについての考えに興味があります。
これまでのところ、 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');
}
リストの下に 1 つも存在しない場合は、同じことを逆に実行して、ドロップ可能アイテムの上にアイテムをプッシュする場所があるかどうかを確認します。
どんな考えでも大歓迎です!