工作解决方案
tl;dr:Refer to this Fiddle for a working answer。
我到处寻找解决将多个选定项目从可排序项拖动到连接的可排序项问题的解决方案,这些答案是我能找到的最佳答案。
不过……
接受的答案有问题,@Shanimal's answer 很接近,但还不够完整。我采用了@Shaanimal 的代码并在其上进行构建。
我修好了:
我补充说:
Fiddle
HTML:
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
<ul>
<li>Four</li>
<li>Five</li>
<li>Six</li>
</ul>
JavaScript(带有 jQuery 和 jQuery UI):
$("ul").on('click', 'li', function (e) {
if (e.ctrlKey || e.metaKey) {
$(this).toggleClass("selected");
} else {
$(this).addClass("selected").siblings().removeClass('selected');
}
}).sortable({
connectWith: "ul",
delay: 150, //Needed to prevent accidental drag when trying to select
revert: 0,
helper: function (e, item) {
var helper = $('<li/>');
if (!item.hasClass('selected')) {
item.addClass('selected').siblings().removeClass('selected');
}
var elements = item.parent().children('.selected').clone();
item.data('multidrag', elements).siblings('.selected').remove();
return helper.append(elements);
},
stop: function (e, info) {
info.item.after(info.item.data('multidrag')).remove();
}
});
注意:
自从我发布了这个,我实现了一些类似的东西 - 将可拖动的列表项连接到一个可排序的,具有多选功能。它的设置几乎完全相同,因为 jQuery UI 小部件非常相似。一个 UI 提示是确保您为可拖动项或可选择项设置了 delay 参数,这样您就可以单击以选择多个项目而无需启动拖动。然后构建一个 看起来 像所有选定元素放在一起的帮助器(创建一个新元素,克隆选定的项目,然后附加它们),但 确保 离开原始项目完好无损(否则它会破坏功能 - 我无法确切说明原因,但它涉及许多令人沮丧的 DOM 异常)。
我还添加了 Shift + Click 功能,使其功能更像原生桌面应用程序。我可能需要创建一个博客,以便更详细地阐述这一点:-)