【发布时间】:2023-04-09 01:07:01
【问题描述】:
我有一个可以拖放到 droppable 中的可拖动对象列表,当这种情况发生时,可拖动对象被克隆并转换为可拖放对象。
这个新的 droppables 是贪婪的,但是当它们接收到一个可拖动对象时,两个 drop 事件都会被触发(来自可拖动对象的 drop 事件和来自可放置区域的 drop 事件)
我做错了什么?我需要事件只触发一次(从新的 droppable 中)
这是一个fiddle:将一个项目拖放到红色区域,然后将另一个项目拖放到您已经拖放的项目中。查看控制台日志。
HTML
<div id="main_droppable"></div>
<ul>
<li class="item" data-id="1">1</li>
<li class="item" data-id="2">2</li>
<li class="item" data-id="3">3</li>
<li class="item" data-id="4">4</li>
<li class="item" data-id="5">5</li>
</ul>
JS
$(".item").data("active", false);
$(".item").draggable({
helper: "clone",
appendTo: "#main_droppable",
scroll: false,
start: function(event, ui)
{
if($(this).data("active") == false)
{
$(this).fadeTo(100, 0.2);
}
else
{
return false;
}
},
revert: function(is_valid_drop)
{
if(!is_valid_drop)
{
$(this).fadeTo(100, 1).data("active", false);
return true;
}
else
{
$(this).data("active", true);
}
}
});
$("#main_droppable").droppable({
drop: function(event, ui)
{
console.log("drop main");
addNewItem(ui.helper);
return false;
}
});
function addNewItem($oldItem)
{
var $newItem = $oldItem.clone(false).fadeTo(100, 1).data("active", true);
$oldItem.remove();
$newItem.draggable({
containment: "parent",
});
$newItem.droppable({
greedy: true,
drop: function(event, ui)
{
console.log("drop item");
$(this).fadeTo(100, 0, function()
{
var $originalItem = $("ul").find(".item[data-id=" + $(this).data("id") + "]");
$originalItem.fadeTo(100, 1).data("active", false);
$("#main_droppable").find(".item[data-id=" + $originalItem.data("id") + "]").remove();
});
addNewItem(ui.helper);
}
});
$("#main_droppable").append($newItem);
}
CSS
#main_droppable
{
border: 1px solid red;
min-height: 50px;
}
.item
{
display: inline-block;
border: 1px solid blue;
width: 25px;
height: 25px;
}
【问题讨论】:
-
所以如果你做了重叠放置,项目不应该再次移回可拖动对象?
-
@TarunLalwani 为什么不应该这样做?此外,重点是双落事件
-
我从未使用过 droppables,所以只是想了解问题所在,并了解您希望看到的预期行为是什么?
-
如果我对@Matias Canepa 的理解正确,您希望蓝色的可拖动对象也成为可放置对象,这样您就可以在视觉上嵌套可放置对象吗?
-
@RobertUdah 有点……可拖动对象确实转换为可放置对象。但他们并不贪婪,我希望他们如此
标签: jquery jquery-ui jquery-ui-droppable