Accepted solution is cleaner but has 1 problem. Once draggable is Dropped over Green Area, it will beocome Droppable even on white Area... (Note revert: false
)
Updates to that answer with correct code.
DEMO2
$('.draggable').draggable({
revert: 'invalid'
});
$('#droppable, #block').droppable({
accept: '.draggable',
drop: function( event, ui ) {
if(!ui.draggable.data('original')){
ui.draggable.data('original',ui.draggable.draggable("option", "revert"));
}
if (this.id == 'block') {
ui.draggable.draggable({ revert: true });
} else {
ui.draggable.draggable({ revert: ui.draggable.data('original') });
}
}
});
Looks like this question already has answer. but here is my attempt to solve same problem.
DEMO
$('#block').droppable({
accept: '.draggable',
drop: function (event, ui) {
if (ui.draggable.data('revert')) {
ui.draggable.data('revert', false);
var old = ui.draggable.draggable("option", "revert");
ui.draggable.draggable("option", "revert", true);
setTimeout(function () {
ui.draggable.draggable("option", "revert", old);
}, 100);
}
},
out: function (event) {
$('.draggable').data('revert', false);
},
over: function (event,ui) {
ui.draggable.data('revert', true);
}
});
$('#droppable').droppable({
accept: function (elem) {
if ($('.draggable').data('revert')) {
return false;
}
return elem.hasClass("draggable");
}
});
$('.draggable').draggable({
revert: 'invalid'
});