工作需要写的一个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 相关文章推荐
JavaScript自动设置IFrame高度的小例子
Jun 08 Javascript
JS 精确统计网站访问量的实例代码
Jul 05 Javascript
js改变文章字体大小的实例代码
Nov 27 Javascript
javascript操作表格排序实例分析
May 06 Javascript
javascript实现输出指定行数正方形图案的方法
Aug 03 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
Jan 29 Javascript
浅析JavaScript中var that=this
Feb 17 Javascript
微信小程序 支付后台java实现实例
May 09 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
Jan 03 Javascript
利用原生JS实现data方法示例代码
May 28 Javascript
构建Vue大型应用的10个最佳实践(小结)
Nov 07 Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 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中使用Oracle数据库(5)
2006/10/09 PHP
PHP 定界符 使用技巧
2009/06/14 PHP
学习YUI.Ext 第七天--关于View&JSONView
2007/03/10 Javascript
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
SeaJS入门教程系列之完整示例(三)
2014/03/03 Javascript
jquery操作对象数组元素方法详解
2014/11/26 Javascript
jQuery中dequeue()方法用法实例
2014/12/29 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
2017/09/30 Javascript
vue通过路由实现页面刷新的方法
2018/01/25 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
javascript实现摄像头拍照预览
2019/09/30 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
Python实现类继承实例
2014/07/04 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
django中嵌套的try-except实例
2020/05/21 Python
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
波兰家居饰品和厨房配件网上商店:Maleomi
2020/12/15 全球购物
Weblogic的布署方式
2013/08/23 面试题
Internal修饰符有什么含义
2013/07/10 面试题
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
施工安全标语
2014/06/07 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
辞职信如何写
2015/02/27 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis