jQuery UI 的 Sortable 组件允许用户通过拖放操作对列表中的元素进行重新排序。当需要实现跨列表复制功能时,可以通过配置 Sortable 的 connectWith
选项来实现列表间的交互。
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<style>
.list-container {
display: flex;
gap: 20px;
}
.list {
width: 200px;
min-height: 200px;
border: 1px solid #ccc;
padding: 10px;
background: #f9f9f9;
}
.item {
margin: 5px 0;
padding: 5px;
background: #fff;
border: 1px solid #ddd;
cursor: move;
}
</style>
</head>
<body>
<div class="list-container">
<ul id="list1" class="list">
<li class="item">项目1</li>
<li class="item">项目2</li>
<li class="item">项目3</li>
</ul>
<ul id="list2" class="list">
<li class="item">项目A</li>
<li class="item">项目B</li>
</ul>
</div>
<script>
$(function() {
$("#list1, #list2").sortable({
connectWith: ".list",
receive: function(event, ui) {
// 复制项目而不是移动
if($(this).has(ui.item).length > 1) {
$(ui.item).remove();
}
}
}).disableSelection();
});
</script>
</body>
</html>
$(function() {
$("#list1, #list2").sortable({
connectWith: ".list",
helper: "clone", // 拖拽时创建副本
start: function(event, ui) {
// 标记原始项目
ui.item.data("original-parent", ui.item.parent());
},
stop: function(event, ui) {
// 如果拖拽到同一列表,则移除副本
if(ui.item.parent().is(ui.item.data("original-parent"))) {
ui.item.remove();
}
}
}).disableSelection();
});
原因: 默认行为是移动项目
解决: 使用 helper: "clone"
并在 stop
事件中处理
原因: 没有正确处理接收逻辑
解决: 在 receive
事件中检查项目是否已存在
原因: CSS 冲突 解决: 确保为拖拽元素和占位符设置明确的样式
通过合理配置 jQuery UI Sortable,可以实现灵活的跨列表复制功能,满足各种交互需求。