È possibile annullare l'operazione di trascinamento chiamando il metodo cancel
del widget draggable (il metodo non è documentato, ma il suo nome non inizia con un carattere di sottolineatura, che lo rende probabilmente più "sicuro" da utilizzare in modo affidabile). Funziona solo durante l'evento start
, tuttavia, poiché gli altri eventi si verificano troppo tardi per attivare l'animazione di annullamento.
Tuttavia, il widget sortable sarà ancora registrare un calo, anche se l'operazione di trascinamento viene annullata, in modo da avere anche rimuovere l'elemento appena aggiunto (durante la manifestazione stop
, come si verifica l'evento start
troppo presto):
$("#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...
}
}
});
È possibile visualizzare i risultati in this fiddle (il quarto elemento verrà sempre ripristinato).
Aggiornamento: Come John Kurlak sottolinea giustamente nei commenti, l'articolo non fa revert a causa della chiamata a draggable("cancel")
, ma perché è ui.sender
null
nel nostro caso. Lanciare qualcosa porta allo stesso comportamento.
Ahimè, tutte le altre combinazioni ho provato risultato nella voce di essere ripristinato senza l'animazione che si svolgono, quindi forse la nostra migliore scommessa è quella di evitare l'accesso a ui.sender
invece scrivere qualcosa di simile:
start: function(event, ui) {
if (!canDropThatVideo(ui.item)) {
throw "cancel";
}
}
L'eccezione non identificata apparirà comunque nella console, però.
fonte
2011-08-19 19:31:47
Hey Grazie per la risposta! Sto lottando per farlo funzionare - il test (canDropThatVideo) ha bisogno di trovare la posizione che è stata eliminata nella lista in modo che possa comparare con i video adiacenti. Ho provato qualcosa del tipo: // get vids adiacenti var nextVid = $ (ui.item) .next(); var prevVid = $ (ui.item) .prev(); ma questi non sembrano ottenere quelli corretti - probabilmente perché è nell'evento di inizio ... Dovrebbe funzionare? – lopsided
@ user612911, è più complicato ma può funzionare. Devi associare l'evento 'sort' invece di' start' e usare 'ui.placeholder.next()' e 'ui.placeholder.prev()', rispettivamente. Probabilmente dovrai anche ricordare la decisione che hai preso sull'oggetto in qualche modo (magari con 'data()'), in modo che il gestore di 'stop' sappia cosa fare. (Per inciso, non è necessario chiamare '$()' sui membri 'ui': sono già oggetti jQuery.) –
Grande, ho funzionato bene ora.Ho anche allegato alcune logiche all'evento 'start' del trascinamento per aggiungere alcune classi 'cantDropHere' agli elementi che non sono drop spaces validi e quindi hanno escluso quelle classi dall'ordinata. Grazie! – lopsided