あなたはdraggableウィジェット(その方法が文書化されていないですが、その名前は間違いなく確実に使用することは「より安全」になり、アンダースコア、始まらない)のcancel
メソッドを呼び出すことにより、ドラッグ操作を元に戻すことができます。ただし、start
イベント中にのみ動作しますが、他のイベントが遅すぎて復帰アニメーションをトリガしないためです。あなたはまた、新たに追加された項目を削除する必要がありますので(stop
イベント中start
イベントがあまりにも早く発生すると、)
しかし、sortableウィジェットはまだ、ドラッグ操作がキャンセルされた場合でも、ドロップを登録します。
$("#yourSortable").sortable({
start: function(event, ui) {
if (!canDropThatVideo(ui.item)) {
ui.sender.draggable("cancel");
}
},
stop: function(event, ui) {
if (!canDropThatVideo(ui.item)) {
ui.item.remove();
// Show an error...
}
}
});
結果はthis fiddleで表示されます(4番目の項目は常に元に戻ります)。
更新:ジョンKurlakは当然のコメントで指摘するように、項目があるためdraggable("cancel")
への呼び出しの戻りませんが、ui.sender
は、我々の場合でnull
ですので。何かを投げると同じ振る舞いになります。
ああ、私は場所を取るアニメーションせずに逆戻りされている項目に結果を試してみました他のすべての組み合わせなので、多分私たちの最善の策は、ui.sender
にアクセスしないよう、代わりのようなものを書くことです:
start: function(event, ui) {
if (!canDropThatVideo(ui.item)) {
throw "cancel";
}
}
キャッチされない例外しかし、コンソールにはまだ表示されます。
お返事ありがとうございます!私はそれが動作するように苦労している - テスト(canDropThatVideo)は、それが隣接するビデオと比較することができるようにリストにドロップされている位置を見つける必要があります。私は次のようなものを試しました: //隣接するvidsを取得する var nextVid = $(ui.item).next(); var prevVid = $(ui.item).prev(); しかし、これらは正しいものを取得していないようです - おそらくその開始イベントのために...それは動作するはずですか? – lopsided
@ user612911、それはより複雑ですが、うまくいく可能性があります。 'start'の代わりに' sort'イベントにバインドし、それぞれ 'ui.placeholder.next()'と 'ui.placeholder.prev()'を使う必要があります。また、 'stop'ハンドラが何をすべきかを知るためには、何らかの形で(おそらく' data() 'を使って)項目に関する決定を覚えておかなければならないでしょう。 (さて、あなたは 'ui'のメンバーに' $() 'を呼び出す必要はありません。彼らはすでにjQueryオブジェクトです。) –
すごくうまくいきました。私はまた、いくつかの 'cantDropHere'クラスを有効なドロップスペースではない要素に追加するために、ドラッグ可能な 'start'イベントにいくつかのロジックを付けて、それらのクラスをソート可能なものから除外しました。ありがとう! – lopsided