jQuery UI Draggable:克隆项目并禁用相同(原始项目)的第二次拖动

Posted

技术标签:

【中文标题】jQuery UI Draggable:克隆项目并禁用相同(原始项目)的第二次拖动【英文标题】:jQuery UI Draggable: clone item and disable a second drag of the same (original item) 【发布时间】:2017-06-26 13:33:57 【问题描述】:

我有以下情况:

用户可以从不同的表中选择要包含在视图中的列。

我想为每个表的列创建一个单独的列表,并为视图中的(用户选择的)列创建一个列表。

我希望用户将列从表 x、y、z 拖放到视图中。

我发现了一个有趣的

 <a href="http://jsfiddle.net/B5PH4/253">JSfiddle</a>

这允许我将列表项从顶部 div 复制到目标 div,但它有一些问题:

    可以无限次复制同一个列表项(它应该只包含一次,然后以某种方式停用)

    一旦放入目标 div,就无法移除(发回)项目。 我再次提到将有 1 个目标(视图)和多个源(单个表的列)。我希望删除的项目回到正确的表格中。

我很清楚jQuery UI Sortable with Connect List。但它似乎没有给我对拖放源/目标的所需控制级别(上面的问题 2),

你做过类似的事情吗?您至少知道部分解决方案吗?或者你能推荐我另一个这样做的 jQuery 插件吗?

谢谢!

【问题讨论】:

【参考方案1】:

这里我调整了 jquery 示例中的列表,所以它应该是你想要的。

sortable1 和 3 是表格,而 sortable 2 是视图。

我只将可排序的 1 和 3 连接到 2,但不是相反,以停止拖回表格,然后有一个删除按钮,用于分离项目并使用属性将其放回正确的位置。 你也可以像这样跟踪位置

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Sortable - Connect lists</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <link rel="stylesheet" href="/resources/demos/style.css">
  <style>
  #sortable1, #sortable2, #sortable3
    border: 1px solid #eee;
    width: 142px;
    min-height: 20px;
    list-style-type: none;
    margin: 0;
    padding: 5px 0 0 0;
    float: left;
    margin-right: 10px;
  
  #sortable1 li, #sortable2 li, #sortable3 li 
    margin: 0 5px 5px 5px;
    padding: 5px;
    font-size: 1.2em;
    width: 120px;
  
  </style>
  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <script>
  $( function() 
    	$( "#sortable1, #sortable3" ).sortable(
      		connectWith: "#sortable2"
    	);
	$( "#sortable2" ).sortable();

	$("#sortable1 span, #sortable3 span").click(function(event)
		var item = $(event.target).closest('li');
		$('#'+$(event.target).attr('parent')).append(item.detach());
	);
   );
  </script>
</head>
<body>
 
<ul id="sortable1" class="connectedSortable">
  <li class="ui-state-default">Item 1<span parent="sortable1" style="color: red">*</span></li>
  <li class="ui-state-default">Item 2<span parent="sortable1" style="color: red">*</span></li>
</ul>
 
<ul id="sortable2" class="connectedSortable">
  <li class="ui-state-highlight">Item 1</li>
  <li class="ui-state-highlight">Item 2</li>
</ul>

<ul id="sortable3" class="connectedSortable">
  <li class="ui-state-highlight">Item 1<span parent="sortable3" style="color: red">*</span></li>
  <li class="ui-state-highlight">Item 2<span parent="sortable3" style="color: red">*</span></li>
</ul>
 
 
</body>
</html>

【讨论】:

非常感谢!这正是我想要的。 如果我将每个 ul 放在一个单独的 div 中,位置为:relative,只要我将一个 li 拖出它的原始列表(例如从 #sortable1 到 #sortable2),助手就会消失。我只剩下指针了。它仍然有效,但看起来很糟糕。你知道如何解决这个问题吗?我需要使用 position:relative 的包装器来实现 Perfect Scroll。如果我从 CSS 中删除 position:relative 并让其他所有内容保持不变,那么助手就会回来。 嘿@AdrianSuteu 我似乎无法复制这个。这是我得到的jsfiddle。你的元素的 z-index 可能有问题吗? 嘿@Andrew Mcghie。再次感谢您的关注。请看一下这个jsfiddle。我注意到 如果我删除 position:relative 或 overflow:auto/scroll 会起作用但是我需要它们两者才能使用完美滚动条。 酷我想通了。助手是它所在的 div 的孩子,这就是它弄乱滚动条的原因。您需要做的是将helper: "clone", appendTo: document.body 添加到可排序的 1 和 3,这意味着辅助元素被克隆然后附加到主体,因此它不再是 div 的子元素。因此,您可能需要更改一些样式。

以上是关于jQuery UI Draggable:克隆项目并禁用相同(原始项目)的第二次拖动的主要内容,如果未能解决你的问题,请参考以下文章

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

jquery ui的sortable拖动克隆问题

Jquery UI Draggable:将帮助器对齐鼠标位置

使用网格恢复“无效”不会使用 jQuery UI Draggable 返回到起始位置

jquery ui sortable + draggable 获取被拖动项目的当前索引

Jquery 使克隆图像可拖动和调整大小