简易而又灵活的Javascript拖拽框架(一)

一、开篇

最近在做js拖拽的时候,发现了一个强大而又灵活的拖拽框架,(之前用了代码混淆器,还好代码比较短,我就翻译过来了)利用这个框架不仅能实现简单的拖动,更能轻易的实现各种复杂的拖放功能。这一篇先实现最简单的拖拽,稍微复杂的拖放将在后面的文章里写出来。

二、代码

先把代码贴出来

Code

使用方法

Drag.init(handle,dragBody);这样可以让鼠标拖动元素。Handle为拖动的把手,dragBody是在拖动时需要移动的元素。

 

如果需要更高级的控制拖动或者拖放的话,可以给dragBody设置三个方法

dragBody.onDragStart=function(left,top,mouseX,mouseY){}

onDragleft,top,mouseX,mouseY){}

onDragEndleft,top,mouseX,mouseY){}

这四个参数分别是:拖动对象的left属性、拖动对象的top属性(此时拖动对象的position为absolute)、鼠标当前的x、鼠标当前的y。在每个过程中都可以通过四个参数来更精确的控制拖动的每个过程,更主要的是我们不需要去管被鼠标拖动的元素是怎么移动的,这些都在框架中已经做好了,这让拖拽看起来更整洁。框架具体是怎么运转的,其实很简单

 

三、原理

Drag有几个成员

Drag.obj用来存放鼠标正在被拖动的元素,只有在鼠标按下过后才会赋值,鼠标松开便为空了。便于在这几个方法之间都能够轻易的找到正在被拖动的元素。

Drag.init主要是用来订阅handleonmousedown事件,所以handle一旦点击,则会执行Drag.start方法。

Drag.start是用来注册documentmousemovemouseup事件的,而且会调用我们定义的dragBody.onDragStart方法(这里的dragBody就是通过Drag.obj来获得的),以便处理框架以外需要处理的事情。

Mousemove的时候会不断的触发Drag.drag方法,这个方法主要是控制dragBody的移动(通过前后两个瞬间的位移差来调整dragBody的位置),以及调用外部的dragBody.onDrag方法,处理框架以外的事情。

Documentmouseup方法,调用外部的onDragEnd方法,释放document绑定的两个事件,以及将临时的obj置为空

四、示例下载

 点此下载示例

posted @ 2008-09-16 10:00 LongWay 阅读(2529) 评论(13) 编辑 收藏

 回复 引用 查看   
#1楼2008-09-16 10:08 | 黄美华      
不知道有没有类似google的 2个 panel之间的拖动 最后转换位置?? 多谢共享
 回复 引用 查看   
#2楼[楼主]2008-09-16 11:29 | LongWay      
@黄美华
哦,我正好打算在第三篇中就写这个,呵呵!

 回复 引用 查看   
#3楼2008-09-17 10:31 | 向世界出发      
怎么不提供一下你发现的那个强大而又灵活的拖拽框架的地址?
 回复 引用 查看   
#4楼[楼主]2008-09-17 13:18 | LongWay      
@向世界出发
有朋友已经说过,说这”框架“二字用得欠妥,呵呵,其实这就是一个代码段,下载的示例中Drag.js就是这个所谓的”框架“的代码,呵呵

 回复 引用   
#5楼2008-09-19 14:44 | pannbo[未注册用户]
您好,有一些问题想问您,
handle.root.onDragStart=new Function();这里仅仅是声明这个函数,但是没有具体的代码,那为什么可以使用handle.root.onDrag(currentLeft,currentTop,e.pageX,e.page)
调用外面对应的函数

这个函数的具体实现代码是什么啊。谢谢。刚学!

 回复 引用 查看   
#6楼[楼主]2008-09-19 14:56 | LongWay      
@pannbo
在Drag.init中,有handle.onmousedown=Drag.start
每当handle被鼠标按下的时候,在Drag.start中就会调用handle.root.onDragStart这个函数,同时会临时的注册document的两个事件,分别使得鼠标移动和弹起的时候调用Drag.drag和Drag.end,这两个方法就会分别调用外面的handle.root.onDrag和handle.root.onDragEnd,并且会传递相应的坐标参数。

 回复 引用   
#7楼2008-09-20 13:45 | pannbo[未注册用户]
@LongWay
我的意思是调用这个函数handle.root.onDrag(currentLeft,currentTop,e.pageX,e.page)这个函数是怎么执行的,好像没有这个函数的具体实现代码。谢谢!

 回复 引用 查看   
#8楼[楼主]2008-09-20 20:46 | LongWay      
@pannbo
在这个示例中中没有用到,在这个系列的第二篇和第三篇文章中的示例才用到了的~

 回复 引用 查看   
#9楼2008-10-07 14:40 | 阿一(杨正祎)      
强大,关注此系列文章。
 回复 引用   
#10楼2008-11-18 10:11 | 类成明[未注册用户]
强,我是个初学者,学过php,js没怎么学过,看来js还真强大啊
 回复 引用   
#11楼2009-01-26 01:11 | tinxon[未注册用户]
建议鼠标移动到可拖动区域改变鼠标形态 不然大多数访问者不会去拖动它的
 回复 引用 查看   
#12楼2009-03-25 15:31 | Alone      
记下!!!
 回复 引用 查看   
#13楼2011-06-27 09:02 | leijuanjuan      
@LongWay
是要你发地址是什么