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 相关文章推荐
jquery多浏览器捕捉回车事件代码
Jun 22 Javascript
不提示直接关闭网页窗口的JS示例代码
Dec 17 Javascript
详解JavaScript中的blink()方法的使用
Jun 08 Javascript
简单谈谈ES6的六个小特性
Nov 18 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
Aug 24 Javascript
Vue打包后出现一些map文件的解决方法
Feb 13 Javascript
11行JS代码制作二维码生成功能
Mar 09 Javascript
利用js实现前后台传送Json的示例代码
Mar 29 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
Apr 01 Javascript
实例介绍JavaScript中多种组合继承
Jan 20 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
Apr 15 Javascript
Canvas跟随鼠标炫彩小球的实现
Apr 11 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将向Java靠拢
2006/10/09 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
javascript web页面刷新的方法收集
2009/07/02 Javascript
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
python实现linux下抓包并存库功能
2018/07/18 Python
详解numpy的argmax的具体使用
2019/05/27 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
python计算无向图节点度的实例代码
2019/11/22 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
文科生自我鉴定
2014/02/15 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
开工仪式主持词
2014/03/20 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
机械机修工岗位职责
2014/08/03 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
教师个人培训总结
2015/02/11 职场文书
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技