jQuery UI 的 greedy droppable 没有按预期工作

jQuery UI's greedy droppable not working as expected

我有一个 draggables 列表,可以放在 droppable 中,当发生这种情况时,draggables 被克隆并转换为 droppables。

这个新的 droppables 是贪婪的,但是当它们接收到 draggable 时,两个放置事件都会被触发(draggable 的 drop 事件和 droppable area 的 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;
}

我认为 dragables 实际上变得贪婪,但 #main_droppable 事件仍然被触发,因为:

当您将另一个 .item 元素放在另一个元素之上时,将触发将 .item 放入另一个 .item 的预期操作。

    $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();
        ...

您实际上是用新项目替换了原始项目,因此触发了 #main_droppable 事件。

我不能说我知道如何在不改变您的预期行为的情况下解决意外的副作用,但希望您对 greedy 属性似乎不起作用的原因有更好的线索。

嗯...这与特定的 class...

有关

当我放下可拖动对象并克隆它时,ui-draggable-dragging class 留在原地。所以为了让它工作我不得不删除它,然后一切都按预期工作。

我更改此行:

var $newItem = $oldItem.clone(false).fadeTo(100, 1).data("active", true);

进入这个:

var $newItem = $oldItem.clone(false).fadeTo(100, 1).data("active", true).removeClass("ui-draggable-dragging");

已更新 fiddle:https://jsfiddle.net/3118zjg1/1/