Операцию перетаскивания можно отменить, вызвав метод cancel
перетаскиваемого виджета (этот метод недокументирован, но его имя не начинается с подчеркивания, что, вероятно, делает его "безопаснее"использовать надежно).Однако он работает только во время события start
, поскольку другие события происходят слишком поздно для запуска анимации возврата.
Однако виджет sortable все равно регистрирует падение, даже если перетаскиваниеоперация отменена, поэтому вам также необходимо удалить вновь добавленный элемент (во время события stop
, так как событие start
происходит слишком рано):
$("#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...
}
}
});
Результаты можно просмотреть в эта скрипка (четвертый элемент всегда будет возвращаться).
Обновление: Как справедливо указывает Джон Курлак в комментариях, элемент не возвращается из-за вызова кdraggable("cancel")
, а потому что ui.sender
- это null
в нашем случае.Бросок чего-либо приводит к тому же поведению.
Увы, все другие комбинации, которые я пробовал, приводят к тому, что элемент возвращается без анимации, поэтому, возможно, наш лучший выбор - избегать доступа к ui.sender
и вместо этого написатьнапример:
start: function(event, ui) {
if (!canDropThatVideo(ui.item)) {
throw "cancel";
}
}
Неизвестное исключение все равно появится в консоли.