jQuery UI贪婪的droppable没有按预期工作

时间:2018-05-18 15:48:20

标签: jquery jquery-ui jquery-ui-droppable

我有一个可拖放的列表,而不是放在一个droppable中,当发生这种情况时,可拖动的可拖动器被转换为droppables。

这个新的droppables是贪婪的,但是当它们收到拖动时,两个drop事件都被触发(来自可拖动区域的drop事件和来自droppable区域的drop事件)

我做错了什么?我需要事件只触发一次(来自新的可放置)

这里是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;
}

1 个答案:

答案 0 :(得分:2)

嗯......这与特定班级有关......

当我放弃拖拽并克隆它时,ui-draggable-dragging班级保持不变。因此,为了使其工作,我必须删除它,然后一切都按预期工作。

我更改了这一行:

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");

更新小提琴:https://jsfiddle.net/3118zjg1/1/