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 21 Javascript
JavaScript调用后台的三种方法实例
Oct 17 Javascript
Web表单提交之disabled问题js解决方法
Jan 13 Javascript
javascript修改图片src的方法
Jan 27 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
Oct 10 Javascript
canvas绘制一个常用的emoji表情
Mar 30 Javascript
JS库之Particles.js中文开发手册及参数详解
Sep 13 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
Nov 22 Javascript
vue项目中axios请求网络接口封装的示例代码
Dec 18 Javascript
微信小程序rich-text富文本用法实例分析
May 20 Javascript
微信小程序实现批量倒计时功能
Nov 01 Javascript
在VUE style中使用data中的变量的方法
Jun 19 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
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
JavaScript 继承使用分析
2011/05/12 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
Python实现类继承实例
2014/07/04 Python
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
Python实现基本线性数据结构
2016/08/22 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
应届毕业生个人求职自荐信
2014/01/06 职场文书
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript