You could use the 'data' method on the droppable elements to store a reference to the draggables they've accepted so far. So, for instance, you can do something like this:
<script language="javascript">
$(function() {
$('.droppable').droppable({
greedy:true,
[...other:options],
over: function(event,ui) {
var already_dragged = $(this).data('mysite.dropped_items');
if($.inArray(ui.draggable.id,already_dragged) >= 0) {
$(this).droppable('disable');
}
},
out: function(event,ui) {
$(this).droppable('enable');
},
drop: function(event,ui) {
var already_dragged = $(this).data('mysite.dropped_items');
if($.inArray(ui.draggable.id,already_dragged) < 0) {
already_dragged.push(ui.draggable.id);
$(this).data('mysite.dropped_items',already_dragged);
}
}
}).data('mysite.dropped_items',new Array());
});
</script>
<div id="droppable1" class="droppable"></div>
<div id="droppable2" class="droppable"></div>
<div id="draggable_1" class="draggable"></div>
Essentially what this is doing is this...
We've used the jQuery data object to attach an array called 'mysite.dropped_items' to each $('.droppable') element. Every time you hover a draggable over one of these droppables, the system will check to see if that droppable's id is already in its 'mysite.dropped_items' array. If it is, then the droppable will become disabled. If it's not, everything will work as expected.
I haven't tested this exact block of code but in theory, it should work. I hope that helps.