ドロップ可能なものdiv#space
とドラッグ可能なもののコレクションがありli.element
ます。をドラッグするli.element
とdiv#space
、新しいul.group
ものが作成され、にli.element
追加され、ul.group
最後にul.group
ドロップ可能になります。
与えられた
これらの要素を次のように動作させたいと思います。
- それを含まないに
li.element
ドロップすると、はに追加されますul.group
li.element
ul.group
- それを含む
li.element
にドロップするとul.group
、は元の位置に戻りますli.element
- が(の外側に)
li.element
ドロップされると、上記のように新しいグループが作成されます。div#space
ul.group
ul.group
問題は、要素がそれを受け入れない要素にドロップされると、親div#space
がイベントをキャッチして新しいグループを作成することです。
には、droppableが要素ul.grpup
であるかどうか、およびまだドロップされていないかどうかをチェックするaccept関数があります。
newULGroup.droppable({
drop: ...
accept: function(ui)
{
var isElement = ui.hasClass('element')
var elementId = '.' + ui.data().id
var isAlreadyPresent = $(this).find(elementId).length > 0
return isElement && (!isAlreadyPresent)
},
greedy: true
});
ドロップハンドラーですべてを受け入れて無視しない場合、この動作をどのように実装しますか?(私は試していませんが、うまくいくと思います)
編集
それを修正する試み
jquery-ui-1.8.4.jsにパッチを適用して、イベントをaccept関数に渡しました。これで、を使用して伝播を停止できますが、ドラッグ可能なヘルパーを手動で$(event).stopPropagation()
アニメーション化して元の位置に戻し、復帰をシミュレートしてから、domから削除する必要があります。
accept: function(ui, event)
{
var isCriteria = ui.hasClass('criteria')
var criteriaId = '.' + ui.data().id
var isAlreadyPresent = $(this).find(criteriaId).length > 0
var accepted = isCriteria && (!isAlreadyPresent)
if (event && !accepted)
{
$(event.target).animate(ui.offset(), {complete: function() {$(this).remove()}})
$(event).stopPropagation()
}
return accepted
}
残念ながら、元の要素からのドラッグ可能な動作も破壊されているようです。なんで、なんで?