一起来写段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 基础知识 被自己遗忘的
Oct 15 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
Apr 25 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
Mar 02 Javascript
基于Vue.js的表格分页组件
May 22 Javascript
AngularJS 霸道的过滤器小结
Apr 26 Javascript
使用JavaScript实现一个小程序之99乘法表
Sep 21 Javascript
使用javaScript实现鼠标拖拽事件
Apr 03 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
Nov 21 Javascript
Javascript读写cookie的实例源码
Mar 16 Javascript
深入了解Hybrid App技术的相关知识
Jul 17 Javascript
微信小程序获取用户绑定手机号方法示例
Jul 21 Javascript
JavaScript随机数的组合问题案例分析
May 16 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建立文件夹代码
2015/01/06 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
wordpress之js库集合研究介绍
2007/08/17 Javascript
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
js中有关IE版本检测
2012/01/04 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
Python读取图片属性信息的实现方法
2016/09/11 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
python关于调用函数外的变量实例
2019/12/26 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
html5理解head_动力节点Java学院整理
2017/07/13 HTML / CSS
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
护士的岗位职责
2013/12/04 职场文书
结婚典礼证婚词
2014/01/11 职场文书
留学推荐信写作指南
2014/01/25 职场文书
李培根演讲稿
2014/05/22 职场文书
药店采购员岗位职责
2014/09/30 职场文书
争先创优个人总结
2015/03/04 职场文书
运动会入场词
2015/07/18 职场文书
采购员工作总结范文
2015/08/12 职场文书