如何区分在同一列表中拖动和从一个列表移动到连接列表时的可排序更新事件
How to differentiate between the sortable update events when dragging within the same list and when moving from one list to a connected list
我有两个连接的可排序列表,#origin
和#destination
。当您从#origin
拖放到#destination
时,我可以看到以下事件按此顺序发生:
#origin
更新#origin
移除#destination
接收#destination
更新
但是,当在#origin
列表中拖放时,仅执行#origin
更新功能。
问题是,当执行#origin
更新时,它看起来与在同一列表中拖放时完全相同。在这两种情况下,ui.sender
都没有设置,并且由于它是在执行remove函数之前执行的,所以我无法设置临时变量来说明发生了什么。
(看这个Fiddle,看看控制台(
我想在更新函数中包含一个ajax调用,而不需要执行两次。因此,我需要一种方法来区分从一个列表拖动到另一个列表时调用的#origin
更新(因此我基本上只能使用return false
(和在同一列表中拖动时调用的更新。
我想得到ui.position
并检查该坐标是否在#origin
的边界内,但似乎必须有一个更简单的解决方案。
这里有一种方法:为每组、起点和终点设置一个标志。在sortable
上初始化它,如下所示:
var updates={origin:false,destination:false};
$( ".config-room-ul" ).sortable({//...
在更新方法中,将其添加到顶部
update: function(e, ui) {
updates[$(this).attr('id')]=true; //...
现在为在末尾激发的stop
事件添加一个处理程序:
stop:function (e,ui) {
if (updates.origin===true && updates.destination===true)
{
console.log('dragged from one group to another group');
}
else if(updates.origin===true && updates.destination===false)
{
console.log('dragged within origin');
}
else if(updates.origin===false && updates.destination===true)
{
console.log('dragged within destination');
}
//finally, clear out the updates object
updates.origin=false;
updates.destination=false;
}
现在,控制台应该显示"在原点内拖动"或"在目标内拖动",如果某个对象在其自己的组内拖动。如果拖动到另一个组,它应该显示"从一个组拖到另一组"。
看小提琴:http://jsfiddle.net/Wr9d2/3/
PS如果你需要确定在组之间拖动时从哪个组开始和结束拖动,我认为代码很容易编辑。
我想到的另一种方法是计算拖动前后#origin
列表的子元素数量并进行比较,而不是使用位置。如果它们不同,则调用的update
函数来自#origin
。您还需要比较元素ID以确保它们匹配。
首先在您的sortable
声明之前添加以下内容:
var sender_id = null;
var sender_children = 0;
然后添加以下拖动启动选项:
start: function(e, ui) {
sender_id = $(this).attr("id");
// Get number of child elements from the sender. We subtract 1
// because of the placeholder (which adds another child)
sender_children = $(this).children().length - 1;
}
然后在update
函数中,检查发送方的id是否匹配,ui.sender
是否为null,发送方元素的子元素数是否不同。它应该少一个,因为您拖动的元素已被删除。如果是,那么跳过那个,因为它是从原点而不是目的地调用的。
if ($(this).attr("id") == sender_id
&& ui.sender == null
&& $(this).children().length != sender_children
) {
return true;
}
请在JSFiddle上查看。
- jQuery UI可排序-多连接列表拖动
- 对级联下拉列表使用不同的连接字符串
- 单击已连接的可排序项时查找列表文本
- 如何在同一个网页上创建两个连接列表
- Jquery幻灯片中的列表,连接第一个和最后一个列表元素以创建旋转木马
- 链接下拉列表选择列表代码 -- 连接数据
- Jquery:连接列表计数器
- 保存动态创建的 jQuery 连接可排序列表的顺序
- 在 d3.js 中填充已连接节点的选择列表
- 如何将 jQuery UI 连接列表拖放限制为单个方向
- 断开连接时更新客户端中的用户列表
- 在连接到可拖动列表的 jQuery 可排序项中,我如何告诉特定列表项可拖动项被放置到
- 如何将地点列表与谷歌地图点连接起来
- 如何使用 DOM 而不是在 HTML 连接上创建包含格式化项的列表
- 如何使用 JavaScript 获取计算机中连接的摄像机列表
- 给定整数列表,找到可获取的最高值并按降序连接
- AngularJS使用FileSelect连接下拉列表
- 给定两个连接的可排序 JQuery 列表,我怎么知道元素被放在哪个容器上
- Socket.IO获取连接的客户端列表
- jQuery UI可在连接的可排序列表中选择