工作需要写的一个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 位置插件
Dec 25 Javascript
js 表格隔行颜色
Dec 02 Javascript
Javascript 命名空间模式
Nov 01 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
Jan 04 Javascript
jquery.zclip轻量级复制失效问题
Jan 08 Javascript
原生JS实现垂直手风琴效果
Feb 19 Javascript
原生JS实现九宫格抽奖效果
Apr 01 Javascript
JS实现点击Radio动态更新table数据
Jul 18 Javascript
微信小程序仿微信运动步数排行(交互)
Jul 13 Javascript
深入理解Vue 的钩子函数
Sep 05 Javascript
npm 常用命令详解(小结)
Jan 17 Javascript
vue-cli3中配置alias和打包加hash值操作
Sep 04 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/02/21 PHP
php二维数组转成字符串示例
2014/02/17 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
JavaScript中Math对象使用说明
2008/01/16 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
python写的一个文本编辑器
2014/01/23 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
python列出目录下指定文件与子目录的方法
2015/07/03 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
2018/07/04 Python
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
八年级语文教学反思
2014/02/11 职场文书
经济管理毕业生求职信
2014/03/15 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
行政求职信
2014/07/04 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL