jQuery UI 可排序:移动克隆但保持原始

Posted

技术标签:

【中文标题】jQuery UI 可排序:移动克隆但保持原始【英文标题】:jQuery UI sortable: Move clone but keep original 【发布时间】:2012-12-21 09:39:41 【问题描述】:

现在我有一列元素,我将它拖到我拖动的位置,它会克隆,但当我放下时,它也会删除原始元素。

$( ".column" ).sortable(
        helper: 'clone',
        connectWith: ".column",
        connectWith: ".grid",
        start: function(e, ui)
            ui.placeholder.height(ui.item.height());
             $(".column" ).find('.portlet:hidden').show()
             console.log('started')
        ,
        stop: function(event, ui) 
            $(ui.helper).clone(true).removeClass('box ui-draggable ui-draggable-dragging').addClass('box-clone').appendTo('body');
        
    );

我怎样才能将原件保留在其所在的位置(无需将其重新附加到列中)并让克隆移动到所需的位置?

【问题讨论】:

使用clone()时要注意生成无效的html(重复ID)。 This question 非常相似,并且有一个很好的答案——看看投票最多的,而不是被接受的。 【参考方案1】:

在停止事件处理程序中使用$(this).sortable('cancel') 将项目恢复到其原始列表/位置。 http://api.jqueryui.com/sortable/#method-cancel

$( ".column" ).sortable(
        helper: 'clone',
        connectWith: ".column",
        connectWith: ".grid",
        start: function(e, ui)
            ui.placeholder.height(ui.item.height());
             $(".column" ).find('.portlet:hidden').show()
             console.log('started')
        ,
        stop: function(event, ui) 
            $(ui.helper).clone(true).removeClass('box ui-draggable ui-draggable-dragging').addClass('box-clone').appendTo('body');
            $(this).sortable('cancel');
        
    );

更新:

要将元素附加到项目所在位置的第二个列表中,请执行以下操作类似

stop: function(event, ui) 
            var toListID = ui.item.parent().attr('id');   
            var idx = $('#' + toListID).children().index($(ui.item[0]));
            if(idx== -1)return;
            var elm = $(ui.item[0]).clone(true).removeClass('box ui-draggable ui-draggable-dragging').addClass('box-clone');
            $('#' + toListID).children(':eq('+idx+')').after(elm);
            $(this).sortable('cancel');
        

查看fiddle查看完整演示

【讨论】:

这似乎取消了克隆元素。当我放下时,没有任何东西进入放置位置。 我明白你现在在想什么,我之前尝试过这个解决方案来追加,但它需要在实际放置的位置。不只是添加到底部。关于如何避免附加的任何想法? 对于 jQuery $('.list2').children().eq(idx).after(elm);。我认为这也稍微更有效(根据文档)。 非常感谢更新,其中包含用于复制到指定位置的明确示例!最有帮助! @adamb 你的小提琴有问题。那就是当您在 list1 中上下移动项目时,无论您是否将它们拖到那里,它们都会在 list2 中重复。你如何防止这种情况发生?【参考方案2】:

如果有人使用新版本,请使用:

revert: true

更多详情:jQuery Sortable - Keep it in original list

【讨论】:

非常感谢您让我开心。我得到了我需要的东西

以上是关于jQuery UI 可排序:移动克隆但保持原始的主要内容,如果未能解决你的问题,请参考以下文章

jQuery拖放:克隆的可拖动移动原始

使用 jQuery 可排序时如何保留原始列表项

jquery可拖动但保留原始元素所在的副本

jquery UI 可拖动助手:克隆从原始中删除可拖动?

jQuery UI:从原始 div 拖动和克隆,但保留克隆

jQuery UI:可排序:正在排序的项目的占位符克隆