一起来写段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常见注意事项
Jan 01 Javascript
js trim函数 去空格函数与正则集锦
Nov 20 Javascript
javascript代码编写需要注意的7个小细节小结
Sep 21 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
Nov 05 Javascript
JavaScript中消除闭包的一般方法介绍
Mar 16 Javascript
基于js对象,操作属性、方法详解
Aug 11 Javascript
easyui combobox开启搜索自动完成功能的实例代码
Nov 08 Javascript
谈谈第三方App接入微信登录 解读
Dec 27 Javascript
js实现延迟加载的几种方法
Apr 24 Javascript
详解vue-cli@2.x项目迁移日志
Jun 06 Javascript
jQuery表单选择器用法详解
Aug 22 jQuery
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
May 13 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安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
用循环或if语句从json中取数据示例
2014/08/18 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
Python实现将n个点均匀地分布在球面上的方法
2015/03/12 Python
python开发之for循环操作实例详解
2015/11/12 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
Python实现的桶排序算法示例
2017/11/29 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
浅谈Python 参数与变量
2020/06/20 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
高中自我评价分享
2013/12/05 职场文书
海南地接欢迎词
2014/01/14 职场文书
保密工作责任书
2014/04/16 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
精神文明单位申报材料
2014/05/02 职场文书
文明班集体申报材料
2014/05/23 职场文书
英语分层教学实施方案
2014/06/15 职场文书
早会开场白台词大全
2015/06/01 职场文书
安全守法证明
2015/06/23 职场文书