一起来写段JS drag拖动代码


Posted in Javascript onDecember 09, 2010

1、为要被拖移三个事件,onmousedown,onmousemove,onmouseup
2、在onmousemove事件中来处理被拖移元素的位置的变化,其实说白了元素要移动的距离就是鼠标两次移动之间的距离。
3、其中还包括setCapture,releaseCapture,目的就是为了被搬移的元素始终能拥有焦点。
以前大致就是以前的认识,可以参见 JS拖动技术--- 关于setCapture 这个实现,后来随着工作要求的提高,做的工作都是要跨浏览器的,所以就重新构思并参考一些开源代码做了实现。
现在大致思路可分析为以下几步,我一一为您展现。
1、 我们是为了拖移而搬移吗?当然不是,如google地图,当每次搬移后他的目的是为了计算当前空间坐标来加载地理信息。所以我这里设计了几个常见事件。以下是事件列表
onDragStart :元素发生拖移时,如果注册该事件,触发时会接收到两个参数x,y分别为被搬移元素发生拖移时的坐标
onDrag : 元素拖移过程中,如果注册该事件,触发时会接收到两个参数nx,ny拖移过程中坐标发生的偏移量
onDragEnd :元素发生结束时,如果注册该事件,触发时会接收到两个参数x,y分别为被搬移元素的当前坐标
2、 onmousedown事件应该绑定给谁?以前我都是绑定给被拖移元素的,后来发现很不灵活,现在设计为可绑定给任意不相关的元素同时实现该元素的拖动。
3、 如何来实现元素搬移过程中一直拥有焦点?因为要跨浏览器,所以就不再用setCapture之类的方法,这里换种思维,为什么元素元素搬移过程中没有了焦点呢,主要是我们把onmousemove事件注册到了被拖移的元素上,而这并不是必需的,所以当元素触发onmousedown事件后,我把onmousemove、onmouseup事件直接注册到document上,这样鼠标移到哪都会有焦点。
说完了这么多,直接看代码结构吧!

Drag = { 
obj: null, 
init: function (options) { 
options.handler.onmousedown = this.start; 
options.handler.root = options.root || options.handler; 
var root = options.handler.root; 
root.onDragStart = options.dragStart || new Function(); 
root.onDrag = options.onDrag || new Function(); 
root.onDragEnd = options.onDragEnd || new Function(); 
}, 
start: function (e) {//此时的this是handler 
var obj = Drag.obj = this; 
obj.style.cursor = 'move'; 
e = e || Drag.fixEvent(window.event); 
ex = e.pageX; 
ey = e.pageY; 
obj.lastMouseX = ex; 
obj.lastMouseY = ey; 
var x = obj.root.offsetLeft; 
var y = obj.root..offsetTop; 
obj.root.style.left = x + "px"; 
obj.root.style.top = y + "px"; 
document.onmouseup = Drag.end; 
document.onmousemove = Drag.drag; 
obj.root.onDragStart(x, y); 
}, 
drag: function (e) { 
e = e || Drag.fixEvent(window.event); 
ex = e.pageX; 
ey = e.pageY; 
var root = Drag.obj.root; 
var x = root.style.left ? parseInt(root.style.left) : 0; 
var y = root.style.top ? parseInt(root.style.top) : 0; 
var nx = ex - Drag.obj.lastMouseX + x; 
var ny = ey - Drag.obj.lastMouseY + y; 
root.style.left = nx + "px"; 
root.style.top = ny + "px"; 
Drag.obj.root.onDrag(nx, ny); 
Drag.obj.lastMouseX = ex; 
Drag.obj.lastMouseY = ey; 
}, 
end: function (e) { 
var x = Drag.obj.root.style.left ? parseInt(Drag.obj.root.style.left) : 0; 
var y = Drag.obj.root.style.top ? parseInt(Drag.obj.root.style.top) : 0; 
Drag.obj.root.onDragEnd(x, y); 
document.onmousemove = null; 
document.onmouseup = null; 
Drag.obj = null; 
}, 
fixEvent: function (e) { 
e.pageX = e.clientX + document.documentElement.scrollLeft; 
e.pageY = e.clientY + document.documentElement.scrollTop; 
return e; 
} 
}

上面init主要处理一些初如化工作,如记录onDragStart、onDrag、onDragEnd三个事件, handler为处理拖动事件的那个元素,root为被拖动的元素。
当在handler上点击后触发Drag.start方法,Drag.start主要为记录住鼠标相对整个页面的位置;给document注册onmouseup、onmousemove事件,及触发onDragStart事件。
Drag.drag方法也很简单,主要作用就是更新被搬移元素位置,同时记录住鼠标相对整个页面的位置。
Drag.end方法就更简单了,就是做一些收尾工作。

最后给大家附段使用的代码吧,祝大家学习愉快!

Drag.init({ 
handler: document.getElementById("handler"), 
root:document.getElementById("root"); 
}); 
<div id="root"> 
<h2 id="handler"></h2> 
</div>
Javascript 相关文章推荐
在JavaScript中实现命名空间
Nov 23 Javascript
jQuery ui1.7 dialog只能弹出一次问题
Aug 27 Javascript
Javascript仿PHP $_GET获取URL中的参数
May 12 Javascript
javascript的事件触发器介绍的实现
Jun 05 Javascript
JavaScript实现垂直向上无缝滚动特效代码
Nov 23 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
vue中引用swiper轮播插件的教程详解
Aug 16 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 Javascript
Vue实现base64编码图片间的切换功能
Dec 04 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
Dec 10 Javascript
antd日期选择器禁止选择当天之前的时间操作
Oct 29 Javascript
vue video和vue-video-player实现视频铺满教程
Oct 30 Javascript
教您去掉ie网页加载进度条的方法
Dec 09 #Javascript
javascript 折半查找字符在数组中的位置(有序列表)
Dec 09 #Javascript
基于jQuery的一个扩展form序列化到json对象
Dec 09 #Javascript
来自国外的页面JavaScript文件优化
Dec 08 #Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
Dec 08 #Javascript
javascript中callee与caller的用法和应用场景
Dec 08 #Javascript
js下通过prototype扩展实现indexOf的代码
Dec 08 #Javascript
You might like
无限级别菜单的实现
2006/10/09 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
Python函数返回值实例分析
2015/06/08 Python
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
python web基础之加载静态文件实例
2018/03/20 Python
Python rstrip()方法实例详解
2018/11/11 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
python通过链接抓取网站详解
2019/11/20 Python
Python小白学习爬虫常用请求报头
2020/06/03 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
人力资源作业细则
2014/03/03 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
考试作弊检讨书
2015/01/27 职场文书
2015年教研工作总结
2015/05/23 职场文书