Prevent drop of list item in JqueryUI sortable
You can use a combination of the stop
and sortable('cancel')
methods to validate the item being moved. In this example, upon an item being dropped, I check if the item is valid by:
- Checking if the item has the class
number
- and checking if the list item was dropped in
list2
This is slightly more hard-coded that I'd like, so alternatively what you could do is check the parent of the dropped item against this
, to check if the lists are different. This means that you could potentially have an item of number
in list1
and list2
, but they're not interchangeable.
jsFiddle Example
$(function() {
$('ul').sortable({
connectWith: 'ul',
stop: function(ev, ui) {
if ($(ui.item).hasClass('number') && $(ui.placeholder).parent()[0] != this) {
$(this).sortable('cancel');
}
}
});
});
After a few experiments, I've found that by far the easiest method is to use the remove event, that essentially only fires when you try to drop an item into a new sortable (that was previously made available as a target using connectWith).
Simply add this to your sortable call:
remove:function(e,ui) {
if(ui.item.hasClass('your_restricted_classname')) return false;
},
Try this example
$('#list1').sortable({ connectWith: 'ul' }); $('#list2').sortable({ connectWith: 'ul', receive: function(ev, ui) { if(ui.item.hasClass("number")) ui.sender.sortable("cancel"); } });
For anyone reading this in future, as mentioned by briansol in comments for the accepted answer, it throws error
Uncaught TypeError: Cannot read property 'removeChild' of null
The the documentation particularly says
cancel()
Cancels a change in the current sortable and reverts it to the state prior to when the current sort was started. Useful in the stop and receive callback functions.
Canceling the sort during other events is unreliable, So it's better use the receive
event as shown in Mj Azani's answer or use the stop
event as follows:
$('#list1').sortable({
connectWith: 'ul',
stop: function(ev, ui) {
if(ui.item.hasClass("number"))
$(this).sortable("cancel");
}
});
$('#list2').sortable({
connectWith: 'ul',
});
Demo