工作需要写的一个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 精粹笔记
May 09 Javascript
JS字符串函数扩展代码
Sep 13 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
May 27 Javascript
使用Node.js为其他程序编写扩展的基本方法
Jun 23 Javascript
微信企业号开发之微信考勤Cookies的使用
Sep 11 Javascript
jQuery ajaxForm()的应用
Oct 14 Javascript
Vue.js 单页面多路由区域操作的实例详解
Jul 17 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
Jul 25 Javascript
详解webpack模块化管理和打包工具
Apr 21 Javascript
VUE路由动态加载实例代码讲解
Aug 26 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
Sep 11 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
Nov 13 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP技术开发技巧分享
2010/03/23 PHP
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
php计算整个目录大小的方法
2015/06/19 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
详解Django中Request对象的相关用法
2015/07/17 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
python自动识别文本编码格式代码
2019/12/26 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
创联软件面试题笔试题
2012/10/07 面试题
投标诚信承诺书
2014/05/26 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android