用Javascript实现网页表单鼠标拖拽
上一篇 / 下一篇 2007-05-07 08:24:32 / 个人分类:js
| PHPChina 开源社区门户E.L7~'Y,ka | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
_m'k}-o ?0 | |||||||||||||
#lYwVc@gz0 | |||||||||||||
;Z`4e2@\ V1]0 | |||||||||||||
| 作者:雪山老人 译 /V_$j!}C |0 怎么用javascrīpt进行拖拽PHPChina 开源社区门户~Tf$c7PH*Q i"{X+?*L+aEGQ0 本文译自:http://www.webreference.com/programming/javascrīpt/mk/column2/index.html
8eP6}2~7t k9C0 Javascrīpt的特点是dom的处理与网页效果,大多数情况我们只用到了这个语言的最简单的功能,比如制作图片轮播/网页的tab等等,这篇文章将向你展示如何在自己的网页上制作拖拽.PHPChina 开源社区门户4pnB.{i%\8c)g5n c }w#^,MU3b @6Q0 有很多理由让你的网站加入拖拽功能,最简单的一个是数据重组.例如:你有一个序列的 内容让用户排序,用户需要给每个条目进行输入或者用select选择,替代前面这个方法的就是拖拽.或许你的网站也需要一个用户可以拖动的导航窗口!那么 这些效果都是很简单:因为你可以很容易的实现! 6AHD'g5w`0EDE,|]B0 网页上实现拖拽其实也不是很复杂.第一你需要知道鼠标坐标,第二你需要知道用户鼠标点击一个网页元素并实现拖拽,最后我们要实现移动这个元素。 )\tTa!aK4?%Z0PHPChina 开源社区门户"Iu&f1R5PV/E{7N点击这里运行代码PHPChina 开源社区门户 qsQ {D \(cA_1K,c:w Y0获取鼠标移动信息PHPChina 开源社区门户\cw euma Og*Bf(e$`[:L;X!z0 第一我们需要获取鼠标的坐标.我们加一个用户函数到document.onmousemove就可以了:PHPChina 开源社区门户GH5Y'n.Iv;T PHPChina 开源社区门户7Yl0?;{/?!aPHPChina 开源社区门户8{ _(Y/B+yn !z(H Pah.aL0document.onmousemove = mouseMove;PHPChina 开源社区门户Qxa'rXs+R_ PHPChina 开源社区门户(Mp4bP@?+S4Wfunction mouseMove(ev){ &q
L6wRRy/m0function mouseCoords(ev){PHPChina 开源社区门户(M
]]&Yo d C)G -zFjlduWP9a0 点击这里运行代码PHPChina 开源社区门户vr\!@$Y%I PHPChina 开源社区门户#V)n!o x~"y$h(M你首先要声明一个evnet对象.不论何时你移动鼠标/点击/按键 等等,会对应一个event的事件.在Internet Explorer里event是全局变量,会被存储在window.event里. 在firefox中,或者其他浏览器,event事件会被相应的自定义函数获取.当我们将mouseMove函数赋值于 document.onmousemove,mouseMove会获取鼠标移动事件. j S^$wO0!?HJ @D@ |0 (ev = ev || window.event) 这样让ev在所有浏览器下获取了event事件,在Firefox下"||window.event"将不起作用,因为ev已经有了赋值.在MSIE下ev是空的,所以ev将设置为window.event. Y f7h'f:_^G0X@5Zp^(^m6Er'w0 因为我们在这篇文章中需要多次获取鼠标坐标,所以我们设计了mouseCoords这个函数,它只包含了一个参数,就是the event.PHPChina 开源社区门户h:b0JVWIWi PHPChina 开源社区门户d"F r&zBh}我们需要运行在MSIE与Firefox为首的其他浏览器下.Firefox以 event.pageX和event.pageY来代表鼠标相应于文档左上角的位置.如果你有一个500*500的窗口,而且你的鼠标在正中间,那么 paegX和pageY将是250,当你将页面往下滚动500px,那么pageY将是750.此时pageX不变,还是250.PHPChina 开源社区门户-X BPC1L#z ']"@"|4J+G^H0 MSIE和这个相反,MSIE将event.clientX与 event.clientY来代表鼠标与ie窗口的位置,并不是文档.当我们有一个500*500的窗口,鼠标在正中间,那么clientX与 clientY也是250,如果你垂直滚动窗口到任何位置,clientY仍然是250,因为相对ie窗口并没有变化.想得到正确的结果,我们必须加入 scrollLeft与scrollTop这两个相对于文档鼠标位置的属性.最后,由于MSIE并没有0,0的文档起始位置,因为通常会设置2px的边框 在周围,边框的宽度包含在document.body.clientLeft与clientTop这两个属性中,我们再加入这些到鼠标的位置中.PHPChina 开源社区门户)E4ZT.r([){/ao PHPChina 开源社区门户M;chMq wn)t9?Q很幸运,这样mouseCoords函数就完成了,我们不再为坐标的事操心了. Vo^ |'K:v w0P];T:M)WdCXqm7z0捕捉鼠标点击PHPChina 开源社区门户)d2yh6e$]"F `TL PHPChina 开源社区门户 U5A)GWT下次我们将知道鼠标何时点击与何时放开.如果我们跳过这一步,我们在做拖拽时将永远不知道鼠标移动上面时的动作,这将是恼人的与违反直觉的. F;BS!w_(m!h)e z4R:yu07oe-^3r2PdT%z0 这里有两个函数帮助我们:onmousedown与onmouseup.我们预先设 置函数来接收document.onmousemove,这样看起来很象我们会获取document.onmousedown与 document.onmouseup.但是当我们获取document.onmousedown时,我们同时获取了任何对象的点击属性如:text, images,tables等等.我们只想获取那些需要拖拽的属性,所以我们设置函数来获取我们需要移动的对象.PHPChina 开源社区门户 |B6SD YA*? PHPChina 开源社区门户4OX{li_d点击这里运行代码 'ye8O#A#T,t:Z3l0PHPChina 开源社区门户7S7]{qcQ Z ~移动一个元素 MF%\&v H0PHPChina 开源社区门户e4Z6H3wE$~X i我们知道了怎么捕捉鼠标移动与点击.剩下的就是移动元素了.首先,要确定一个明确的页面位置,css样式表要用'absolute'.设置元素绝对位置意味着我们可以用样式表的.top和.left来定位,可以用相对位置来定位了.我们将鼠标的移动全部相对页面top-left,基于这点,我们可以进行下一步了. K2{\{fph\0C/XX:F\5E0 当我们定义item.style.position='absolute',所有的操作都是改变left坐标与top坐标,然后它移动了。PHPChina 开源社区门户 p1bq/A[t}q PHPChina 开源社区门户/Y j$w"U%yX&R7o f7[document.onmousemove = mouseMove; f!EH[Bn0var dragObject = null;PHPChina 开源社区门户w
f3ImdiJ9}5| Q~9E` I
k%sv0function getMouseOffset(target, ev){ var docPos = getPosition(target); ?,A
F{}heE0function getPosition(e){ while (e.offsetParent){
L&YsXBWC0 left += e.offsetLeft; return {x:left, y:top};PHPChina 开源社区门户
}ToS.r)q.} ^ function mouseMove(ev){PHPChina 开源社区门户*`5l] Y/I
L/Y if(dragObject){PHPChina 开源社区门户|;aB7I5WN\,S%t return false;PHPChina 开源社区门户N&t;?(H,b0b
_b I/C 8MC nCi5L4~'L}0function makeDraggable(item){PHPChina 开源社区门户k#?P!~
`0H |