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

需求:


  (1)实现元素可拖拽

  (2)自定义拖拽范围

  (3)自定义按下触发拖拽的元素

  (4)支持拖拽过程中的事件监听

实现思路:

  元素可拖拽的实现关键为,mousedown、mousemove、mouseup三大事件。mousedown为按下触发拖动的事件,可以定义到元素本身或其他元素;mousemove为拖动范围元素的事件,该事件负责重新设置拖动元素的位置属性;mouseup为拖动范围元素的事件,该事件主要为了释放mousemove、mouseup事件。

  为避免当拖动元素内容有较大内容时,重新绘制位置造成的性能影响,可以采用拖动空元素(代理)来实现拖动过程,当拖动结束时,再调整实际元素的位置即可。

图例:

客户代码:


 1 <body>
2 <div id="header" style="padding-left:100px;padding-top:10px">
3 <h1>可拖拽说明:</h1>
4 <p>(1)让一个元素可以拖动,可以自定义拖拽范围(第一个被设定了position的父元素),默认是window,可以自定义拖拽时鼠标的按下区域,默认是可拖拽元素本身</p>
5 <p>(2)事件支持:鼠标按下准备拖拽;拖拽中;拖拽完成后</p>
6 <p>(3)如果拖拽范围是window,拖拽元素html会被放置在body下面</p>
7 <p>(4)为获得良好的拖动性能,请尽量采用代理拖动模式</p>
8 <br />
9 <br />
10 </div>
11 <div id="dragContainer" style="padding:10px; margin:0 auto;width:960px;height:350px;padding-top:20px; background:#cccccc;padding-left:100px">
12 <div id="dragDiv" style="width:400px;height:200px; background:#0094ff;">
13 <h2 id="title" style="background:#E8D379;height:35px;">标题..............</h2>
14 用户名:<input type="text" value="hjwen" />
15 <p>(1)简单实用的ui,不常用,不必要的功能,不实现</p>
16 <p>(2)只支持js创建,不支持html属性形式,尽量保持html的整洁</p>
17 </div>
18 </div>
19 <script type="text/javascript">
20 var drag;
21 $(function () {
22 //drag = $("#dragDiv").draggable({ dragArea: ‘dragContainer‘, mousedownObj: ‘title‘ });//限定范围,按标题拖动
23 drag = $("#dragDiv").draggable({ mousedownObj: ‘title‘ });//window拖动范围,按标题拖动
24 //drag = $("#dragDiv").draggable({ dragArea: ‘dragContainer‘, mousedownObj: ‘title‘,proxy:false });//非代理模式拖动
25 //默认,拖动范围body,按元素拖动
26 //drag = $("#dragDiv").draggable({
27 // onStart: function (params) {
28 // //console.log("onStart"+JSON.stringify(params));
29 // },
30 // onDraging: function (params) {
31 // //console.log("onDraging" + JSON.stringify(params));
32 // },
33 // onStop: function (params) {
34 // //console.log("onStop" + JSON.stringify(params));
35 // }
36 //});
37 });
38 </script>
39 </body>

组件代码:


  1 /******************************************
2 *作者:hjwen
3 *电邮:[email protected]
4 *版本:1.0
5 *版权许可:中国通用开源许可协议V1.0
6 *说明:可拖动组件定义
7 ******************************************/
8 (function ($) {
9 /******渲染目标*******/
10 /********拖拽: mousedown -- > mousemove --->mouseup ************/
11 function renderHtml(target) {
12 var settings = target.data(‘settings‘);
13 target.css("position", "absolute");
14 settings.dragArea.css("position", "relative");
15 var offset;
16 if (settings.isWindows) {//如果拖动范围是window,则需要将对象放置在body下
17 offset = target.offset();
18 target.css({ top: offset.top, left: offset.left });
19 target.appendTo(settings.dragArea);
20 }
21 var areawith = settings.dragArea.innerWidth();
22 var areaheight = settings.dragArea.innerHeight();
23 var targetwidth = target.innerWidth();
24 var targeheight = target.innerHeight();
25 var proxy = null;
26 /*****************低版本ie鼠标捕获特性处理**********************/
27 var isCapture=false;
28 if (typeof settings.mousedownObj[0].setCapture != ‘undefined‘) {
29 isCapture = true;
30 }
31 settings.mousedownObj.css("cursor", "move");
32 settings.mousedownObj.bind("mousedown", function (e) {
33 if (isCapture) {
34 settings.mousedownObj[0].setCapture();
35 }
36 //计算拖动范围
37 var offset = target.position();
38 var finalleft =target.css(‘left‘);
39 var finaltop = target.css(‘top‘);
40 if (settings.proxy) {//创建空代理
41 proxy = $("<div style=\"cursor:move;position: absolute; background:#C9C4F5; height: " + targeheight + "px; width:" + targetwidth + "px; opacity: 0.85;top:" + finaltop + ";left:" + finalleft + ";filter:alpha(opacity=85) \"></div>").insertAfter(target);
42 }
43 e.preventDefault();
44 var diffX = e.clientX - offset.left;
45 var diffY = e.clientY - offset.top;
46 if (typeof settings.onStart === ‘function‘) {
47 settings.onStart({ top: offset.top, left: offset.left });
48 }
49 settings.dragArea.bind("mousemove", function (e) {
50 var left = e.clientX - diffX;
51 var top = e.clientY - diffY;
52 if (left < 0) {
53 left = 0;
54 } else {
55 var w =areawith - targetwidth;
56 if (left > w)
57 left = w;
58 }
59 if (top < 0) {
60 top = 0;
61 } else {
62 var h = areaheight - targeheight;
63 if (top > h)
64 top = h;
65 }
66 if (settings.proxy) {
67 finalleft = left;
68 finaltop = top;
69 proxy.css({ left: left + "px", top: top + "px" });
70 } else {
71 target.css({ left: left + "px", top: top + "px" });
72 }
73 if (typeof settings.onDraging === ‘function‘) {
74 settings.onDraging({ top: top, left: left });
75 }
76 });
77 settings.dragArea.bind("mouseup", function (e) {
78 settings.dragArea.unbind("mousemove");
79 settings.dragArea.unbind("mouseup");
80 if (settings.proxy) {
81 proxy.remove();
82 proxy = null;
83 target.css({ left: finalleft + "px", top: finaltop + "px" });
84 }
85 if (isCapture) {
86 settings.mousedownObj[0].releaseCapture();
87 }
88 if (typeof settings.onStop === ‘function‘) {
89 settings.onStop({ top: finaltop, left: finalleft });
90 }
91 });
92 });
93 };
94 /************私有方法********************/
95 /**********私有方法结束*******************/
96 var methods = {
97 init: function (options) {
98 if (typeof options == ‘undefined‘)
99 options = {};
100 return this.each(function () {
101 var $this = $(this);
102 if (typeof options.dragArea != ‘undefined‘) {
103 options.isWindows = false;
104 if (typeof options.dragArea == ‘string‘) {
105 options.dragArea = $("#" + options.dragArea);
106 }
107 } else {
108 options.isWindows = true;
109 }
110 if (typeof options.mousedownObj == ‘string‘) {
111 options.mousedownObj = $("#" + options.mousedownObj);
112 }
113 $.fn.draggable.defaults.mousedownObj = $this;
114 $.fn.draggable.defaults.dragArea = $(window.top.document.body);
115 var settings = $this.data(‘settings‘);
116 if (typeof settings == ‘undefined‘) {
117 settings = $.extend({}, $.fn.draggable.defaults, options);
118 $this.data(‘settings‘, settings);
119 } else {
120 settings = $.extend({}, settings, options);
121 }
122 //创建ui布局
123 renderHtml($this);
124 if ($.myui.isDebug) {
125 $.myui.log("jQuery.draggable init finish......");
126 }
127 });
128 },
129 destroy: function (options) {
130 return $(this).each(function () {
131 var $this = $(this);
132 $this.removeData(‘settings‘);
133 });
134 }
135 };
136 /*****
137 *options= { mousedownObj: null,//鼠标按下对象/id,默认是拖动对象本身
138 proxy:true,//创建一个代理拖动对象,性能较好
139 dragArea: null, //默认拖动范围对象/Id,不设置则为最顶层window(考虑到有iframe的情况)
140 onStart:function(params){},//开始拖动 params={top:x,left:y}
141 onDraging: function (params) { },//拖动中params={top:x,left:y}
142 onStop: function (params) { }//结束拖动params={top:x,left:y}
143 }
144 *****/
145 $.fn.draggable = function (dragArea) {
146 var method = arguments[0];
147 if (methods[method]) {
148 method = methods[method];
149 arguments = Array.prototype.slice.call(arguments, 1);
150 } else if (typeof (method) == ‘object‘ || !method) {
151 if ($.myui.isDebug) {
152 $.myui.log("jQuery.draggable init.....");
153 }
154 method = methods.init;
155 } else {
156 $.error(‘Method ‘ + method + ‘ does not exist on jQuery.draggable‘);
157 return this;
158 }
159 return method.apply(this, arguments);
160 };
161 //默认值
162 $.fn.draggable.defaults = {
163 mousedownObj: null,//鼠标按下对象/id,默认是拖动对象本身
164 proxy:true,//创建一个代理拖动对象,性能较好
165 dragArea: null, //默认拖动范围对象/Id,不设置则为最顶层window(考虑到有iframe的情况)
166 onStart:null,//开始拖动
167 onDraging:null,//拖动中
168 onStop: null//结束拖动
169 };
170 })(jQuery);

我的开源框架之可拖拽功能实现,布布扣,bubuko.com

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

我的开源框架之可拖拽功能实现的相关文章

JQuery UI的拖拽功能

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

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;

使用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

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

首先我们考虑这样一个业务场景:一个维修部门中分了N个维修组,维修部门的负责人需要将这个部门的维修人员分配到这些组里去. 当然,他可以选中一个维修人员,然后给他分配维修组,但是从人性化角度考虑,若利用拖拽是否更加的快捷和明确呢? 比如我们可以将维修组和维修人员都列出来,然后只需要将维修人员拖动到对应的组里即可完成分组. 另外,由于一个个拖还是太繁琐,还需要实现选中多个维修人员一起分组.那么我们下面一步步来,先实现单个的拖拽功能,再加入多选拖动支持~ 单选拖动 首先,根据我们刚才描述的场景,简单设计

duilib中控件拖拽功能的实现方法(附源码)

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际使用过程中拖拽功能也是有用武之地的.看群里有人问题duilib怎么支持拖拽,我也就写这篇文章说明一下duilib实现控件拖拽的方法. 当我刚接触duilib不就的时候,考虑过duilib拖拽这个功能,当时的想法是,在xml布局中设置一个浮动的控件,正常状态下他是隐藏的,当出发了拖拽条件后将他显示并且