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 相关文章推荐
ext实现完整的登录代码
Aug 08 Javascript
jQuery 各种浏览器下获得日期区别
Dec 22 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
Jan 21 Javascript
css结合js制作下拉菜单示例代码
Feb 27 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
Oct 14 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
Dec 22 Javascript
javascript实现多张图片左右无缝滚动效果
Mar 22 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
Mar 25 Javascript
angular2系列之路由转场动画的示例代码
Nov 09 Javascript
vue.js,ajax渲染页面的实例
Feb 11 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
Aug 25 Javascript
JavaScript工具库MyTools详解
Jan 01 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
PHP5 字符串处理函数大全
2010/03/23 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
关于js datetime的那点事
2011/11/15 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
浅谈Vue.set实际上是什么
2019/10/17 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
简单而又朴实的个人求职信分享
2013/12/12 职场文书
法制报告会主持词
2014/04/02 职场文书
《荷花》教学反思
2014/04/16 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
委托书的写法
2014/09/16 职场文书
感恩教师主题班会
2015/08/12 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python