工作需要写的一个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 Div中加载其他页面的实现代码
Feb 27 Javascript
获取dom元素那些讨厌的位置封装代码
Jun 23 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
Jan 15 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
Oct 21 Javascript
JS、jQuery中select的用法详解
Apr 21 Javascript
JavaScript关于提高网站性能的几点建议(一)
Jul 24 Javascript
vue中的scope使用详解
Oct 29 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
Dec 25 jQuery
js中getBoundingClientRect的作用及兼容方案详解
Feb 01 Javascript
详解微信小程序之scroll-view的flex布局问题
Jan 16 Javascript
vue计算属性computed的使用方法示例
Mar 13 Javascript
Vue3 响应式侦听与计算的实现
Nov 11 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留言本实例代码
2010/05/09 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
python3实现点餐系统
2019/01/24 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
工厂厂长的职责
2013/12/12 职场文书
学习决心书范文
2014/03/11 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
禁止酒驾标语
2014/06/25 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
MySQL 十大常用字符串函数详解
2021/06/30 MySQL
python中__slots__节约内存的具体做法
2021/07/04 Python