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实现输入框获取焦点消失文字
Apr 27 Javascript
移动节点的jquery代码
Jan 13 Javascript
JQuery弹出层示例可自定义
May 19 Javascript
JavaScript使用循环和分割来替换和删除元素实例
Oct 13 Javascript
Javascript限制网页只能在微信内置浏览器中访问
Nov 09 Javascript
js中 计算两个日期间的工作日的简单实例
Aug 08 Javascript
javascript 定时器工作原理分析
Dec 03 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
Dec 22 Javascript
详解webpack babel的配置
Jan 09 Javascript
彻底弄懂 JavaScript 执行机制
Oct 23 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
Jul 19 Javascript
js实现复制粘贴的两种方法
Dec 04 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 根据IP地址控制访问的代码
2010/04/22 PHP
php 不使用js实现页面跳转
2014/02/11 PHP
PHP将session信息存储到数据库的类实例
2015/03/04 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
搭建vue开发环境
2018/07/19 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
详解Vue实战指南之依赖注入(provide/inject)
2018/11/13 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Python 绘图和可视化详细介绍
2017/02/11 Python
pygame实现飞机大战
2020/03/11 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
软件工程毕业生自荐信
2014/07/04 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
党小组推荐意见
2015/06/02 职场文书
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
Python简易开发之制作计算器
2022/04/28 Python
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python
Java Spring读取和存储详细操作
2022/08/05 Java/Android