【问题标题】:jQuery UI Droppable - clone the droppable element?jQuery UI Droppable - 克隆 droppable 元素?
【发布时间】:2016-04-08 19:32:31
【问题描述】:

JSFiddle:https://jsfiddle.net/dy556efs/2/

左侧的元素在放到右侧时应该被克隆。目前,它们已完全移动 - 无法让克隆助手正常工作。

你能指出我正确的方向吗?

$(".social-msl-link-label").draggable({
    connectToSortable: ".social-msl-group-list",
    revert: "invalid",
    helper: "clone"
});

$(".social-msl-links-order li").droppable({
    accept : ".social-msl-link-label",
    tolerance: 'pointer',
    greedy : true,
    hoverClass: 'highlight',
    drop: function(ev, ui) {
        $(ui.draggable).detach().css({position : 'relative', top: 'auto',left: 'auto'}).appendTo(this);
    }
});

【问题讨论】:

    标签: jquery jquery-ui jquery-ui-draggable jquery-ui-sortable jquery-ui-droppable


    【解决方案1】:

    根据helper property 的文档,该元素似乎只是在 拖动它时被克隆。换句话说,您仍然必须在分离/附加元素之前手动克隆元素。在分离之前使用.clone() method

    Updated Example

    $(".social-msl-links-order li").droppable({
      accept: ".social-msl-link-label",
      tolerance: 'pointer',
      greedy: true,
      hoverClass: 'highlight',
      drop: function(ev, ui) {
        $(ui.draggable).clone(true).detach().css({
          position: 'relative',
          top: 'auto',
          left: 'auto'
        }).appendTo(this);
      }
    });
    

    如果您想删除重复项,您可以遍历可放置元素并将先前放置的元素的文本与兄弟元素进行比较。在drop 回调内部:

    Updated Example

    // ...
    $(this).siblings().filter(function () {
      return $(this).text().trim() === $(ui.draggable).text().trim();
    }).empty();
    

    【讨论】:

    • 完美,谢谢!效果很好,您知道如何进一步扩展它,以便右列只接受每个项目中的 1 个。那么在 JSFiddle 示例中,如果您多次添加“Facebook”,是否会删除之前的版本?
    • 出色的工作,感谢您的帮助!既然你已经把它写出来了,实际上是有道理的,以前想不出一种方法来比较其他元素。
    • @JoshCrozier 为什么是detach()..?
    • @TJ - 这是 OP 最初使用的代码。您可以在文档中阅读remove()detach() 之间的区别。
    • @JoshCrozier 我虽然它是你出于某种目的添加的,nvm。由于clone() 方法返回一个内存元素,我想知道在它上面调用detach() 有什么用...我没有看到OP 的小提琴。再看一遍,才注意到ui.draggable是一个jquery对象,不用$(ui.draggable)...