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 相关文章推荐
图片按比例缩放函数
Jun 26 Javascript
JS日历 推荐
Dec 03 Javascript
在IE下:float属性会影响offsetTop的取值
Dec 22 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
Mar 19 Javascript
基于JavaScript自定义构造函数的详解说明
Apr 24 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
Dec 11 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
Mar 03 Javascript
JavaScript显示表单内元素数量的方法
Apr 02 Javascript
JS实现简单的图书馆享元模式实例
Jun 30 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
Nov 06 Javascript
javascript 初学教程及五子棋小程序的简单实现
Jul 04 Javascript
vue中axios的二次封装实例讲解
Oct 14 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执行速度全攻略
2006/10/09 PHP
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
php组合排序简单实现方法
2016/10/15 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
Python网络爬虫实例讲解
2016/04/28 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
python中format()函数的简单使用教程
2018/03/14 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
Python字典底层实现原理详解
2019/12/18 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
实习生求职自荐信
2014/02/07 职场文书
家长会学生演讲稿
2014/04/26 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
思想品德评语大全
2014/12/31 职场文书
张思德观后感
2015/06/09 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
Django如何创作一个简单的最小程序
2021/05/12 Python
MySQL开启事务的方式
2021/06/26 MySQL