OK、私は仕事をする解決策を考え出しました。
ソート可能な関数の「停止」イベントにキャンセルコードがある場合、キャンセルコードは機能します。ただし、「元に戻す」が完了すると適用されます。問題は、ドロップ可能な「ドロップ」イベントから要素をコピー/元に戻そうとしたことですが、これは早すぎました。
解決策は、「停止」イベントが完了するのを待つことです。これを達成するには、「停止」イベントでチェックされる「コピー待ち」フラグを作成する必要がありました。
ここに例があります
まだ (UX の観点から) 適切ではありませんが、正常に動作します。また、sortable 関数でいつでも revert を false に設定して、わずかに改善することができます。
例のコードは次のとおりです...
var itemCount = 3;
var awaitingCopy = false;
$(init);
function init() {
$("#Items").sortable({
revert: true,
placeholder: "ItemPlaceHolder",
opacity: 0.6,
start: StartDrag,
stop: StopDrag
});
$("#CopyItem").droppable({
hoverClass: "CopyItemActive",
drop: function(event, ui) {
awaitingCopy = true;
}
});
$("#NewItem").click(function(e) {
e.preventDefault();
itemCount++;
var element = $("<div class='Item'>Item " + itemCount + "</div>");
$("#Items").append(element);
element.hide().slideDown(500);
});
}
function CopyItem(element) {
awaitingCopy = false;
var clone = element.clone();
$("#Items").append(clone);
clone.hide().slideDown(500);
}
function StartDrag() {
$("#NewItem").hide();
$("#CopyItem").show();
}
function StopDrag(event, ui) {
if (awaitingCopy) {
$(this).sortable('cancel');
CopyItem($(ui.item));
}
$("#NewItem").show();
$("#CopyItem").hide();
}
とにかく、うまくいけば、これは同じ種類の効果を望む他の人を助けるでしょう...私のデザインを盗むことはありません;)