easyUI拖拽功能讲解以及多选拖拽的实现

首先我们考虑这样一个业务场景:一个维修部门中分了N个维修组,维修部门的负责人需要将这个部门的维修人员分配到这些组里去。

当然,他可以选中一个维修人员,然后给他分配维修组,但是从人性化角度考虑,若利用拖拽是否更加的快捷和明确呢?

比如我们可以将维修组和维修人员都列出来,然后只需要将维修人员拖动到对应的组里即可完成分组。

另外,由于一个个拖还是太繁琐,还需要实现选中多个维修人员一起分组。那么我们下面一步步来,先实现单个的拖拽功能,再加入多选拖动支持~

单选拖动

首先,根据我们刚才描述的场景,简单设计一个布局:

接下来,我们需要做的是:

1、让维修人员对应的小方块可以拖动起来

这就需要把每个小方块都注册成draggable(这里我为每个小方块添加了class=‘employee‘方便选择)

		$('.employee').draggable( {
			revert : true,
			proxy : 'clone',
			onStartDrag : function() {
				$(this).draggable('options').cursor = 'not-allowed';
				$(this).draggable('proxy').css('z-index', 10);
				$(this).draggable('proxy').addClass('dp')
			},
			onStopDrag : function() {
				$(this).draggable('options').cursor = 'move';
			}
		});

关于draggable中的属性设置,这里也讲解一下:

revert:true 表示当停止拖动后,小方块回归原位(false则不回归)

proxy:‘clone‘ 表示拖动的那个元素,如果设置成clone,那么它会自动帮你clone一个元素用来给你拖动,如果要自己写的话,返回的必须是一个jQuery对象。这个在后面多选拖动的实现中会讲到。

onStartDrag 开始拖动时会触发,可以看到这里我们设置了一些视觉上的效果,比如添加一个不可防止的这么一个小角标,并且透明度变低(.dp)

onStopDrag 结束拖动时触发,还原角标

2、让小方块可以放置到上面的组里,并显示出来

那么首先需要把上面的组注册成droppable(这里为组的上一层ul添加了.group-list方便选择)

		$('.group-list li').droppable( { // 注意,这里要用li,不能直接用 .easyui-datagrid
			onDragEnter : function(e, source) {
				$(source).draggable('options').cursor = 'auto';
			},
			onDragLeave : function(e, source) {
				$(source).draggable('options').cursor = 'not-allowed';
			},
			onDrop : function(e, source) {
				var empno = $(source).find('p:eq(0)').html();
				var name = $(source).find('p:eq(1)').html();
				var phone = $(source).find('p:eq(2)').html();
				addEmployee(empno.split(':')[1], name.split(':')[1],
						phone.split(':')[1], $(this).find('[id^=group]'));
				$(source).parent().hide();
			}
		});

这里几个事件都比较好理解,看名字就可以了

onDragEnter: 当拖动的小方块进入时触发

onDragLeave: 当拖动的小方块离开时触发

onDrop: 当拖动的小方块进入后并放开鼠标时触发

当然,onDrop显然是最重要的,放开鼠标后我们需要将小方块代表的维修人员添加到对应的组中,也就是addEmployee(...)这个函数

	function addEmployee(empno, name, phone, dg) {
		var data = dg.datagrid('getData');
		function add() {
			data.total += 1;
			data.rows.push( {
				empno : empno,
				name : name,
				phone : phone
			});
		}
		add();
		dg.datagrid('loadData', data);
	}

这里的dg是通过小方块拖动放开的组来找到的,也就是onDrap函数中$(this).find(‘[id^=group]‘)来找的。这里有个小技巧,就是将组的id都命名成group开头,后面加一个组的编号,这主要是由于easyUI对非id访问元素的支持不是很好。

至此,单选拖拽就讲完了,你可以试试拖动小方块到维修组里试试~

多选拖动

下面开始讲解多选拖动,多选拖动的难点在于,如何选?最完美的方式当然是单击小方块后选中,然后一起拖到维修组中。

但是,单击小方块也会被认为是 拖动 而触发onDrapStart,而并不会触发onClick事件。

那么是否可以在小方块中添加一个多选框(checkbox)而不触发拖动事件?

我实践后发现由于在拖动时会clone出一个小方块并且覆盖在之前的小方块上,所以基本上点不到原来的小方块(快速点击倒是会成功,但是显然这种方案也不行)

而我之前做这个的时候用了一种方法,是利用了draggable的deltaX和deltaY两个属性,这两个属性的意思是clone出来的一个小方块相对于原来的小方块的位置

这样的话只要避免遮盖到checkbox就可以多选了!但是由于单击的时候会跳一下,这里并不推荐,有兴趣的朋友可以试试。

另外一种方法,就是将可拖动的小方块和多选框分开,这样一来就不会被遮挡了(为什么之前没想到),下面就直接上代码了,大家可以和之前单选的对比着看

		$('.employee').draggable( {
			revert : true,
			proxy : function(source){
				if($(":checkbox:checked").length == 0){
					var clone = $(source).clone();
					clone.insertBefore($(source));
					return clone;
				}else{
					var div = $("<div/>");
					$(":checkbox:checked").each(function(){
						var clone = $(this).prev().clone();
						div.append(clone);
					});
					div.insertBefore($(source));
					return div;
				}
			},
			onStartDrag : function() {
				$(this).draggable('options').cursor = 'not-allowed';
				$(this).draggable('proxy').css('z-index', 10);
				$(this).draggable('proxy').addClass('dp')
			},
			onStopDrag : function() {
				$(this).draggable('options').cursor = 'move';
			}
		});

我这里将选中checkbox多选的和没选checkbox单选的这两种情况分开,这里唯一不一样的就是proxy属性

关于这个proxy其实就是在界面上clone一个代理小方块出来,用来拖动显示用,那么对于多选来说,我们首先需要克隆出选中的小方块,然后将小方块塞到界面中,然后需要将这些小方块返回给proxy。这里还有个问题就是,我尝试了很多次,只能返回jQuery对象,且不能是jQuery数组。所以只能搞个div然后把选中的小方块都塞到这个div里,最后会有一个一起拖着走的效果,当然这纯粹是为了效果好,用之前的proxy:‘clone‘也可以达到多选拖动的目的,只不过在拖动过程中的显示上只会出现最后拖动的那个小方块。

		$('.group-list li').droppable( { // 注意,这里要用li,不能直接用 .easyui-datagrid
			onDragEnter : function(e, source) {
				$(source).draggable('options').cursor = 'auto';
			},
			onDragLeave : function(e, source) {
				$(source).draggable('options').cursor = 'not-allowed';
			},
			onDrop : function(e, source) {
				if($(":checkbox:checked").length == 0){
					var empno = $(source).find('p:eq(0)').html();
					var name = $(source).find('p:eq(1)').html();
					var phone = $(source).find('p:eq(2)').html();
					addEmployee(empno.split(':')[1], name.split(':')[1],
							phone.split(':')[1], $(this)
									.find('[id^=group]'));
					$(source).parent().hide();
				}else{
					var li = $(this);	// 防止each里访问不到this
					var group = li.find('[id^=group]');
					$(":checkbox:checked").each(function(){
						var empno = $(this).prev().find('p:eq(0)').html();
						var name = $(this).prev().find('p:eq(1)').html();
						var phone = $(this).prev().find('p:eq(2)').html();
						addEmployee(empno.split(':')[1], name.split(':')[1],
								phone.split(':')[1], group);
						$(this).parent().hide();
						$(this).removeAttr("checked");
					});
				}
			}
		});

对于拖到维修组中放开鼠标后的处理也要分开讨论了,这个也比较好理解~

那就写到这里~下班回家!

时间: 2024-10-26 06:46:28

easyUI拖拽功能讲解以及多选拖拽的实现的相关文章

使用UGUI实现拖拽功能(拼图小游戏)

实现方式 1.引入UGUI自带的事件系统 UnityEngine.EventSystems 2.为我们的类添加接口 IBeginDragHandler, IDragHandler, IEndDragHandler 1 using UnityEngine; 2 using System.Collections; 3 using UnityEngine.EventSystems; 4 5 public class DragOnPic : MonoBehaviour,IBeginDragHandler

javascript 拖拽功能

拖拽功能是我们经常用到的一个功能,流程如下: 鼠标点击选框时,计算出鼠标位置和选框位置的距离差,也就是disX和disY: 鼠标移动,获取鼠标位置坐标,然后减去步骤一种的距离差,就是选框的坐标: 鼠标弹起时,清除鼠标移动函数 需要注意以下几点: 鼠标移动时,有可能移出选框的范围,所以需要使用全局的移动函数,也就是document.onmousemove: 鼠标弹起时,可能不在选框范围内弹起,程序会出现bug,所以使用全局弹起,也就是 document.onmouseup: 要控制选框的移动范围,

JAVA UI 拖拽功能

java GUI拖拽功能是很实用也相对高级一些的功能. 有一小部分的GUI控件支持他们有dragEnabled属性.这些JComponent包括:javax.swing.JColorChooserjavax.swing.JFileChooserjavax.swing.JListjavax.swing.JTablejavax.swing.JTreejavax.swing.text.JTextComponent 大部分的控件不支持没有这个属性,尤其是常用的jpanel和jframe. 一种简单的方法

Atitit。D&amp;D drag&amp;drop拖拽功能c#.net java swing的对比与实现总结

Atitit.D&D drag&drop拖拽功能c#.net java swing的对比与实现总结 1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制.必须有DragEnter事件(单独写DragDrop事件是不会具有拖拽功能的) 2 3. ---java黑头的拖曳..必须有DragEnter事件(单独写 Drop事件是不会具有拖拽功能的) 2 4. 代码 3 5. 参考 5 1. 实现一个D&D操作一般包括三个步骤: 首先实现一个拖拽源,这个拖拽

bcb ole拖拽功能的实现

最近项目中用到了OLE 拖拽功能 和BCB 一个Form的Drag 不同的是,只有实现了OLE 拖拽才能,从其他程序拖拽数据到Form 下面的代码实现了,同HTML网页拖拽到Form时,Form获得HTML数据 其核心思想是, 1,要实现 COM的 IDropTarget 接口 2,RegisterDragDrop(handle,this); 注册窗口的拖拽 3,窗口类构造 OleInitialize(NULL); 4,窗口类析构时 OleUninitialize(); 5,在下面的代码中,我将

文件拖拽功能失效,原来是UAC把它过滤了

碰到这样一个问题,文件拖拽功能在没有以管理员身份运行的时候是正常的,但是一旦使用管理员身份运行,这个功能就失效了,搜索了好久总算找到原因了. 在window visa以上版本里引入了用户账户控制(UAC),在管理员权限上会过滤掉一些窗口消息,文件拖拽正好也也被过滤了,解决的方法就是使用ChangeWindowMessageFilterEx()解除过滤 //解除window7以上窗口对该消息的过滤 ChangeWindowMessageFilterEx(hwndDlg, WM_DROPFILES,

js实现登陆页面的拖拽功能

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>登陆页面的拖拽功能实现</title> </head> <style type="text/css"> *{ margin:0; padding:0; } a{ text-decoration: none; } .dialog{ width: 380px;

我的开源框架之可拖拽功能实现

需求: (1)实现元素可拖拽 (2)自定义拖拽范围 (3)自定义按下触发拖拽的元素 (4)支持拖拽过程中的事件监听 实现思路: 元素可拖拽的实现关键为,mousedown.mousemove.mouseup三大事件.mousedown为按下触发拖动的事件,可以定义到元素本身或其他元素:mousemove为拖动范围元素的事件,该事件负责重新设置拖动元素的位置属性:mouseup为拖动范围元素的事件,该事件主要为了释放mousemove.mouseup事件. 为避免当拖动元素内容有较大内容时,重新绘

JQuery UI的拖拽功能

JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量的第三方插件可以丰富JQuery UI的功能. JQuery UI提供的API极大简化了拖拽功能的开发.只需要分别在拖拽源(source)和目标(target)上调用draggable和droppable两个函数即可. 拖拽原理 首先要明确几个概念. ource:拖拽源,要拖动的元素. taerge