工作需要写的一个js拖拽组件


Posted in Javascript onJuly 28, 2011
/* 
*使用方法: 
* var d = new Drag({id:'dragPannel',maxLeft:500,maxTop:200}); 
* d.ready(); 
*请注意: 
* 拖动对象的left和top样式必须写在其style属性里边 
* 
*/ 
//矫正调用者。将 fn 作为 newObj 的方法调用 
function repairCaller(newObj, fn){ 
return function(){ 
return fn.apply(newObj, arguments); 
} 
} 
function Drag( config ){ 
this.moveTarget = T.dom.get( config.id ); 
this.startLeft = parseInt(this.moveTarget.style.left); //每次拖动开始时被拖动对象的 left,top 
this.startTop = parseInt(this.moveTarget.style.top); 
this.startClientX = this.startLeft; //保存拖动开始时事件的 clientX, clientY 
this.startClientY = this.startTop; 
this.MAX_LEFT = config.maxLeft||document.documentElement.clientWidth - this.moveTarget.offsetWidth; //元素可以移动的最大范围 
this.MAX_TOP = config.maxTop||document.documentElement.clientHeight - this.moveTarget.offsetHeight; 
this.lock = true; 
} 
Drag.prototype.ready = function(){ 
//绑定事件 
T.bind(document, "mousedown", repairCaller(this,this.down)); 
T.bind(document, "mousemove", repairCaller(this,this.move)); 
T.bind(document, "mouseup", repairCaller(this,this.stop)); 
} 
Drag.prototype.down = function(){ 
//取得事件对象 
var event = T.event.getEvent(arguments[0]), 
target = T.event.getTarget(event); 
if (target == this.moveTarget){ 
this.lock = false; 
//在事件开始时保存各种坐标位置 
this.startLeft = parseInt(this.moveTarget.style.left); 
this.startTop = parseInt(this.moveTarget.style.top); 
this.startClientX = event.clientX; 
this.startClientY = event.clientY; 
} 
}; 
Drag.prototype.move = function(){ 
if(!this.lock ){ 
//取得事件对象 
var event = T.event.getEvent(arguments[0]), 
target = T.event.getTarget(event); 
if(target == this.moveTarget){ 
//如有选择内容,清除之 
//window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); 
//凑数拖动范围有没超过最大限制 
var realLeft = this.startLeft + event.clientX - this.startClientX, //实际的移动范围 
realTop = this.startTop + event.clientY - this.startClientY, 
rightLeft , rightTop; //正确的 left, top 取值 
rightLeft = realLeft > this.MAX_LEFT ? this.MAX_LEFT : ( realLeft > 0 ? realLeft : 0 ); 
rightTop = realTop > this.MAX_TOP ? this.MAX_TOP : ( realTop > 0 ? realTop : 0 ); 
this.moveTarget.style.left = rightLeft + "px"; 
this.moveTarget.style.top = rightTop + "px"; 
} 
else{ 
this.lock = true; 
} 
} 
}; 
Drag.prototype.stop = function(){ 
this.lock = true 
};

后记:
在写的过程中非常需要注意的几点是:
1、拖动层的 position、left 和 top 必须写在 style 里
2、移动过程中设置 left 和 top 要带单位,否则不起作用
3、多级 div 嵌套时需要给父 div 加 over-flow:hidden 样式
完毕!
Javascript 相关文章推荐
jQuery 源代码显示控件 (Ajax加载方式).
May 18 Javascript
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
Dec 09 Javascript
javascript中的prototype属性实例分析说明
Aug 09 Javascript
Jquery 绑定时间实现代码
May 03 Javascript
javascript 基础篇2 数据类型,语句,函数
Mar 14 Javascript
jquery $(this).attr $(this).val方法使用介绍
Oct 08 Javascript
jQuery Validation Plugin验证插件手动验证
Jan 26 Javascript
JS组件Bootstrap实现图片轮播效果
May 16 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
Jun 07 Javascript
使用jQuery实现简单的tab框实例
Aug 22 jQuery
一百行JS代码实现一个校验工具
Apr 30 Javascript
vant IndexBar实现的城市列表的示例代码
Nov 20 Javascript
基于Jquery的开发个代阴影的对话框效果代码
Jul 28 #Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
Jul 28 #Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
Jul 27 #Javascript
另一个javascript小测验(代码集合)
Jul 27 #Javascript
jsTree 基于JQuery的排序节点 Bug
Jul 26 #Javascript
Jquery中显示隐藏的实现代码分析
Jul 26 #Javascript
jquery attr 设定src中含有&(宏)符号问题的解决方法
Jul 26 #Javascript
You might like
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
小程序组件之自定义顶部导航实例
2019/06/12 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
用Python给文本创立向量空间模型的教程
2015/04/23 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
python中id函数运行方式
2020/07/03 Python
python中判断文件结束符的具体方法
2020/08/04 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
SQL数据库笔试题
2016/03/08 面试题
《乡愁》教学反思
2014/02/18 职场文书
党员民主评议自我评价
2014/10/20 职场文书
通知的格式范文
2015/04/27 职场文书
论语读书笔记
2015/06/26 职场文书
婚宴领导致辞
2015/07/28 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
分享7个 Python 实战项目练习
2022/03/03 Python