工作需要写的一个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 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
javascript面向对象之Javascript 继承
May 04 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
js生成随机数(指定范围)的实例代码
Jul 10 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
详解AngularJS中的表单验证(推荐)
Nov 17 Javascript
BootStrap fileinput.js文件上传组件实例代码
Feb 20 Javascript
Vue 父子组件、组件间通信
Mar 08 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
Mar 28 Javascript
JS求1到任意数之间的所有质数的方法详解
May 20 Javascript
JavaScript canvas绘制折线图
Feb 18 Javascript
vue 动态组件用法示例小结
Mar 06 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导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
php基础教程
2015/08/26 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
javascript 写类方式之九
2009/07/05 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
JavaScript获取中英文混合字符串长度的方法示例
2017/02/04 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
在keras中实现查看其训练loss值
2020/06/16 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
岗位竞聘书范文
2014/03/31 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang
python 爬取吉首大学网站成绩单
2021/06/02 Python
Python anaconda安装库命令详解
2021/10/16 Python
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android