一起来写段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 相关文章推荐
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 Javascript
js实现瀑布流的一种简单方法实例分享
Nov 04 Javascript
小白谈谈对JS原型链的理解
May 03 Javascript
AngularJs 动态加载模块和依赖
Sep 15 Javascript
WEB开发之注册页面验证码倒计时代码的实现
Dec 15 Javascript
Bootstrap CSS组件之按钮组(btn-group)
Dec 17 Javascript
js querySelector() 使用方法
Dec 21 Javascript
Three.js的使用及绘制基础3D图形详解
Apr 27 Javascript
javaScript实现复选框全选反选事件详解
Nov 20 Javascript
javascript实现电脑和手机版样式切换
Nov 10 Javascript
express启用https使用小记
May 21 Javascript
js实现掷骰子小游戏
Oct 24 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
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
nodejs微信开发之授权登录+获取用户信息
2019/03/17 NodeJs
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
Python、Javascript中的闭包比较
2015/02/04 Python
Python批量查询域名是否被注册过
2017/06/21 Python
python pandas修改列属性的方法详解
2018/06/09 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
详解Python文件修改的两种方式
2019/08/22 Python
使用pandas的box_plot去除异常值
2019/12/10 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
工程采购员岗位职责
2014/03/09 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
2015年营业员工作总结
2015/04/23 职场文书
论语读书笔记
2015/06/26 职场文书
以下牛机,你有几个
2022/04/05 无线电