js实现拖拽 闭包函数详细介绍


Posted in Javascript onNovember 25, 2012

js拖拽

采用简单的闭包实现方式

/** 
* Created with JetBrains WebStorm. 
* User: lsj 
* Date: 12-11-24 
* Time: 下午12:59 
* To change this template use File | Settings | File Templates. 
*/ 
var dragmanager=(function() 
{ 
//标识移动元素z轴坐标 
var index_z=1; 
//当前的拖拽元素 
var drganow; 
//移动标识符号 
var dragbegin=false; 
//鼠标点击时距离div左边距离 
var relativex=0; 
//鼠标点击时距离div上边距离 
var relativey=0; 
//标识鼠标是否移出 
var isout=false; 
return { 
/** 
* 为document绑定鼠标提起事件,主要防止鼠标移动过快跳出el区域 
*/ 
bingDocOnMouseUp:function() 
{ 
//注册全局的onmouseup事件,主要防止鼠标移动过快导致鼠标和el不同步 
document.onmouseup=function(e) 
{ 
var ev = window.event || e; 
if(isout && dragbegin) 
{ 
//改变div的相对位置 
drganow.style.left= (ev.clientX-relativex)+'px'; 
drganow.style.top=(ev.clientY-relativey)+'px'; 
drganow.style.cursor='normal'; 
dragbegin=false; 
isout=false; 
} 
} 
}, 
/** 
* 将注入的元素绑定事件 
* @param el 
*/ 
registerElementEv:function(element) 
{ 
element.onmousedown=function(e) 
{ 
var ev = window.event || e; 
var clientx=ev.clientX; 
var clienty= ev.clientY; 
var left= parseInt(this.style.left.substring(0, this.style.left.indexOf("p"))); 
var top= parseInt(this.style.top.substring(0, this.style.top.indexOf("p"))); 
relativex=clientx-left; 
relativey=clienty-top; 
index_z++; 
this.style.zIndex=index_z; 
drganow=this; 
dragbegin=true; 
} 
element.onmousemove=function(e) 
{ 
var ev = window.event || e; 
//开始拖拽 
if(dragbegin) 
{ 
//改变div的相对位置 
this.style.left= (ev.clientX-relativex)+'px'; 
this.style.top=(ev.clientY-relativey)+'px'; 
this.style.cursor='move'; 
} 
} 
element.onmouseout=function(e) 
{ 
isout=true; 
} 
element.onmouseup=function(e) 
{ 
var ev = window.event || e; 
if(dragbegin) 
{ 
//改变div的相对位置 
drganow.style.left= (ev.clientX-relativex)+'px'; 
drganow.style.top=(ev.clientY-relativey)+'px'; 
drganow.style.cursor='normal'; 
dragbegin=false; 
} 
} 
} 
} 
})();

1.采用闭包的形式实现 ,方便后期的维护,将移动过程所需的变量全部转移进gridmanager里面
2.拖拽过程中 鼠标移动过快导致移动元素跟不上鼠标的移动,所以要注册document.oumouseup事件,该事件的开关是有移动元素的onmouseout事件触发的
3.拖拽的过程中可能会触发浏览器自身的onmousemove的select事件,可以进行屏蔽ie下是onmousemove="document.selection.empty()"
Javascript 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(1)
Dec 23 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
May 07 Javascript
JavaScript不使用prototype和new实现继承机制
Dec 29 Javascript
javascript中Array()数组函数详解
Aug 23 Javascript
JavaScript深度复制(deep clone)的实现方法
Feb 19 Javascript
js简单时间比较的方法
Aug 02 Javascript
JS获取鼠标选中的文字
Aug 10 Javascript
从零学习node.js之模块规范(一)
Feb 21 Javascript
Vue常用指令V-model用法
Mar 08 Javascript
微信小程序methods中定义的方法互相调用的实例代码
Aug 07 Javascript
VUE实现自身整体组件销毁的示例代码
Jan 13 Javascript
微信小程序canvas开发水果老虎机的思路详解
Feb 07 Javascript
jquery miniui 教程 表格控件 合并单元格应用
Nov 25 #Javascript
JavaScript mapreduce工作原理简析
Nov 25 #Javascript
jquery div 居中技巧应用介绍
Nov 24 #Javascript
js实现在文本框光标处添加字符的方法介绍
Nov 24 #Javascript
js获取TreeView控件选中节点的Text和Value值的方法
Nov 24 #Javascript
js 连接数据库如何操作数据库中的数据
Nov 23 #Javascript
js 如何实现对数据库的增删改查
Nov 23 #Javascript
You might like
php 使用post,get的一种简洁方式
2010/04/25 PHP
深入解析php中的foreach问题
2013/06/30 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
PHP经典面试题集锦
2015/03/19 PHP
用javascript实现点击链接弹出"图片另存为"而不是直接打开
2007/08/15 Javascript
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
Angular2库初探
2017/03/01 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
python如何生成网页验证码
2018/07/28 Python
详解Django的CSRF认证实现
2018/10/09 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
Python的log日志功能及设置方法
2019/07/11 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
快递员岗位职责
2014/09/12 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
微信小程序调用python模型
2022/04/21 Python
Python sklearn分类决策树方法详解
2022/09/23 Python