使用jquery sortable时如何复制项目?

odl*_*dle 57 jquery drag-and-drop list duplicates jquery-ui-sortable

我正在使用这种方法http://jqueryui.com/demos/sortable/#connect-lists连接我拥有的两个列表.我希望能够从列表A拖动到列表B,但是当项目被删除时,我需要将原始列表保留在列表A中.我检查了选项和事件,但我相信没有类似的东西.任何方法?

Ere*_*rez 85

$("#sortable1").sortable({
    connectWith: ".connectedSortable",
    forcePlaceholderSize: false,
    helper: function (e, li) {
        copyHelper = li.clone().insertAfter(li);
        return li.clone();
    },
    stop: function () {
        copyHelper && copyHelper.remove();
    }
});
$(".connectedSortable").sortable({
    receive: function (e, ui) {
        copyHelper = null;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这种方法比Thorsten更好,因为这个方法保留了原始列表的顺序. (4认同)
  • 完美的工作!这应该被标记为正确的答案. (3认同)

Sea*_*son 28

Erez的解决方案对我有用,但我发现其缺乏封装令人沮丧.我建议使用以下解决方案来避免全局变量使用:

$("#sortable1").sortable({
    connectWith: ".connectedSortable",

    helper: function (e, li) {
        this.copyHelper = li.clone().insertAfter(li);

        $(this).data('copied', false);

        return li.clone();
    },
    stop: function () {

        var copied = $(this).data('copied');

        if (!copied) {
            this.copyHelper.remove();
        }

        this.copyHelper = null;
    }
});

$("#sortable2").sortable({
    receive: function (e, ui) {
        ui.sender.data('copied', true);
    }
});
Run Code Online (Sandbox Code Playgroud)

这是一个jsFiddle:http://jsfiddle.net/v265q/190/

  • 在第一个列表中使用隐藏的占位符将使其从精确的位置效果中拖出来,如http://jsfiddle.net/BrianDillingham/v265q/320/ (7认同)

Tho*_*ten 26

首先,看看这个,并阅读@Erez的答案.

$(function () {
    $("#sortable1").sortable({
        connectWith: ".connectedSortable",
        remove: function (event, ui) {
            ui.item.clone().appendTo('#sortable2');
            $(this).sortable('cancel');
        }
    }).disableSelection();

    $("#sortable2").sortable({
        connectWith: ".connectedSortable"
    }).disableSelection();
});
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的缺点是$('#sortable2')的顺序不会被保留.防爆.如果将项目放入列表顶部的$('#sortable2')中,此解决方案将在列表底部呈现已删除的项目.Erez在下面的回答确实保留了掉落的位置,在我的用例中是一个更好的解决方案. (8认同)

小智 7

我知道这已经过时了,但是我无法得到Erez的工作答案,而Thorsten没有为我需要的项目削减它.这似乎完全符合我的需要:

$("#sortable2, #sortable1").sortable({
    connectWith: ".connectedSortable",
    remove: function (e, li) {
        copyHelper = li.item.clone().insertAfter(li.item);
        $(this).sortable('cancel');
        return li.clone();
    }
}).disableSelection();
Run Code Online (Sandbox Code Playgroud)


小智 5

abuser2582707的答案最适合我.除了一个错误:您需要将返回更改为

return li.item.clone();
Run Code Online (Sandbox Code Playgroud)

所以它应该是:

$("#sortable2, #sortable1").sortable({
    connectWith: ".connectedSortable",
    remove: function (e, li) {
        li.item.clone().insertAfter(li.item);
        $(this).sortable('cancel');
        return li.item.clone();
    }
}).disableSelection();
Run Code Online (Sandbox Code Playgroud)