Ваше мышление было правильным, вы должны сделать маленькие ящики жадными выпадающими предметами и обработать на них событие drop
. Сложность заключается в том, чтобы отменить операцию перетаскивания.
По умолчанию ваши перетаскиваемые объекты должны начинаться как revert:'invalid'
. Вам не нужно ничего делать, если они перетаскиваются внутрь большого ящика, который в моем примере использует tolerance:'fit'
, поэтому маленькие ящики должны быть полностью внутри, чтобы их можно было принять.
Я сделал маленькие ящики жадными выпадающими с помощью tolerance:'touch'
, поэтому, если перетаскиваемый маленький ящик касается другого маленького ящика, он вызывает для него обработчик drag
.
Чтобы отменить операцию перетаскивания из обработчика перетаскивания, вы можете сделать обходной путь, установив для перетаскиваемого элемента значение revert:true
, что заставит его вернуться, даже если он был перетащен на принимающий выпадающий объект. Чтобы убедиться, что вы можете снова перетащить этот маленький квадрат, в его событии остановки перетаскивания вы должны сбросить revert:'invalid'
. Событие stop
будет срабатывать при каждом успешном сбросе, а если произойдет откат, то он сработает после завершения отката.
Вы можете попробовать живую демонстрацию здесь: http://jsfiddle.net/htWV3/1/.
HTML:
<div class="drop">
<div class="drag"></div>
<div class="drag"></div>
<div class="drag"></div>
<div class="drag"></div>
<div class="drag"></div>
</div>
CSS:
.drop { display:inline-block; width:300px; height:200px; border:1px solid silver; background-color:whitesmoke; padding:10px; }
.drag { display:inline-block; width:30px; height:30px; border:1px solid silver; background-color:white; }
Javascript:
$('.drop').droppable({
tolerance: 'fit'
});
$('.drag').draggable({
revert: 'invalid',
stop: function(){
$(this).draggable('option','revert','invalid');
}
});
$('.drag').droppable({
greedy: true,
tolerance: 'touch',
drop: function(event,ui){
ui.draggable.draggable('option','revert',true);
}
});
person
DarthJDG
schedule
22.05.2011
revert
может принимать любой селектор, не могли бы вы использовать что-то вродеrevert: ".outside, .valid > div.invalid"
? Предполагая, что элемент, обертывающий «действительный», имеет классoutside
. - person chrisfrancis27   schedule 20.05.2011