How do I duplicate item when using jquery sortable?

后端 未结 6 607
孤街浪徒
孤街浪徒 2020-11-29 20:16

I am using this method http://jqueryui.com/demos/sortable/#connect-lists to connect two lists that i have. I want to be able to drag from list A to list B but when the item

相关标签:
6条回答
  • 2020-11-29 20:51

    The answer of abuser2582707 works best for me. Except one error: You need to change the return to

    return li.item.clone();
    

    So it should be:

    $("#sortable2, #sortable1").sortable({
        connectWith: ".connectedSortable",
        remove: function (e, li) {
            li.item.clone().insertAfter(li.item);
            $(this).sortable('cancel');
            return li.item.clone();
        }
    }).disableSelection();
    
    0 讨论(0)
  • 2020-11-29 20:52
    $("#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;
        }
    });
    
    0 讨论(0)
  • 2020-11-29 20:54

    When using Erez's solution but for connecting 2 sortable portlets (basis was the portlet example code from http://jqueryui.com/sortable/#portlets), the toggle on the clone would not work. I added the following line before 'return li.clone();' to make it work.

    copyHelper.click(function () {
        var icon = $(this);
        icon.toggleClass("ui-icon-minusthick ui-icon-plusthick");
        icon.closest(".portlet").find(".portlet-content").toggle();
    });
    

    This took me a while to figure out so I hope it helps someone.

    0 讨论(0)
  • 2020-11-29 21:00

    For a beginning, have a look at this, and read @Erez answer, too.

    $(function () {
        $("#sortable1").sortable({
            connectWith: ".connectedSortable",
            remove: function (event, ui) {
                ui.item.clone().appendTo('#sortable2');
                $(this).sortable('cancel');
            }
        }).disableSelection();
    
        $("#sortable2").sortable({
            connectWith: ".connectedSortable"
        }).disableSelection();
    });
    
    0 讨论(0)
  • 2020-11-29 21:03

    Erez' solution works for me, but I found its lack of encapsulation frustrating. I'd propose using the following solution to avoid global variable usage:

    $("#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);
        }
    });
    

    Here's a jsFiddle: http://jsfiddle.net/v265q/190/

    0 讨论(0)
  • 2020-11-29 21:03

    I know this is old, but I could not get Erez's answer to work, and Thorsten's didn't cut it for the project I need it for. This seems to work exactly how I need:

    $("#sortable2, #sortable1").sortable({
        connectWith: ".connectedSortable",
        remove: function (e, li) {
            copyHelper = li.item.clone().insertAfter(li.item);
            $(this).sortable('cancel');
            return li.clone();
        }
    }).disableSelection();
    
    0 讨论(0)
提交回复
热议问题