jQuery UI – Droppable只接受一个draggable
我正在制作一个应用程序,即使用一个可放置的div
和一些可拖动的div
。 如何让droppable不接受多个可拖动的div
? 我用Google搜索,但没有找到任何解决方法。
脑海中浮现出一种解决方法。 我如何检查这个可丢弃的div中是否有丢弃的元素? 如果它正忙,则恢复这个可拖动的,这是试图被丢弃
OK为此找到了一个很好的解决方案,主要是’drop’我将droppable设置为仅接受已拖入其中的项目。
当您“禁用”时,您需要重新初始化的“输出”事件不再可用,因此我只是切换了符合条件的项目。
然后我可以使用OUT事件重新接受所有可拖动的项目,因为没有其他任何东西被接受,OUT将不会被其他可拖动项触发:
$(".drop-zone").droppable({ drop: function(event, ui) { $(this).droppable('option', 'accept', ui.draggable); }, out: function(event, ui){ $(this).droppable('option', 'accept', '.drag-item'); } }); });
您可以在第一次drop
后销毁.droppable()
小部件,如下所示:
$(".droppable").droppable({ drop: function( event, ui ) { $(this).droppable("destroy"); } });
您可以在这里试用一个演示 。
易Peasey。 只需在hover在它们上面时启用所有.drop-zone,然后检查当前hover的.drop-zone是否包含可拖动元素
$('.drop-zone').droppable({ over: function(event, ui) { // Enable all the .droppable elements $('.droppable').droppable('enable'); // If the droppable element we're hovered over already contains a .draggable element, // don't allow another one to be dropped on it if($(this).has('.draggable').length) { $(this).droppable('disable'); } } });
该解决方案解决了Likwid_T答案中的一个主要错误。
$('.draggable').draggable({ start: function(ev, ui) { $('.ui-droppable').each(function(i, el) { if (!$(el).find('.ui-draggable').length) $(el).droppable('enable'); }); } }); $('.droppable').droppable({ drop: function(ev, ui) { $(ev['target']).droppable('disable'); } });
这个怎么样:
$(".drop-zone").droppable({ accept: function(draggable) { return $(this).find("*").length == 0; }); });
这样,只有当尚未删除任何元素时,accept函数才返回true。
我花了很多时间来搞清楚它,最后它对我有用:
$( ".drop-zone" ).droppable({ classes: { "ui-droppable-active": "ui-state-active", "ui-droppable-hover": "ui-state-hover" }, accept: function( draggable ){ if (!$(this).hasClass('dropped') || draggable.hasClass('dropped')){ return true; } return false; }, drop: function( event, ui ) { $(this).addClass('dropped'); ui.draggable.addClass('dropped'); }, out: function( event, ui ){ $(this).removeClass('dropped'); ui.draggable.removeClass('dropped'); } });
要启用它,请使用以下选项: $(".selector").droppable({ disabled: **false** });
你也可以通过在droppable具有某个类或属性时恢复可拖动来反过来这样做(在此示例的基础上: https : //stackoverflow.com/a/3418306/1005334 )。
因此,例如,对于droppable,使用rel
属性(您也可以使用class
或其他东西):
$('.drop-zone').droppable({ drop: function () { drop.attr('rel', 'filled'); } });
和拖延:
$('.draggable').draggable({ revert: function (droppable) { if (droppable.attr('rel') == 'filled') { return true; } } });
我的解决方案类似于Likwid_T,除了它使用droppable drop
事件以及维护draggables和droppables之间的链接而不是droppable的out
事件。 我认为使用out
的问题在于,即使将拖动器拖过已经“完全”的可放置然后“移出”它,它也会被触发。
droppable({ drop: function(event, ui) { var $droppable = $(this); var $draggable = ui.draggable; // If the draggable is moved from another droppable, unlink it from the old droppable var oldDropped = $draggable.data('dropped'); if(oldDropped) { $draggable.data('dropped', null); oldDropped.data('dragged', null); } // Link the draggable and droppable $draggable.data('dropped', $droppable); $droppable.data('dragged', $draggable); }, accept: function() { // Only accept if there is no draggable already associated return !$(this).data('dragged'); } });
一个相关的function是将一个项目拖动到已经具有可拖动的droppable上,旧的将被替换并恢复到其初始位置。 我是这样做的:
droppable({ drop: function(event, ui) { var $droppable = $(this); var $draggable = ui.draggable; // Reset position of any old draggable here var oldDragged = $droppable.data('dragged'); if(oldDragged) { // In the CSS I have transitions on top and left for .ui-draggable, so that it moves smoothly oldDragged.css({top: 0, left: 0}); oldDragged.data('dropped', null); } // If the draggable is moved from another droppable, unlink it from the old droppable var oldDropped = $draggable.data('dropped'); if(oldDropped) { $draggable.data('dropped', null); oldDropped.data('dragged', null); } // Link the draggable and droppable $draggable.data('dropped', $droppable); $droppable.data('dragged', $draggable); }, });