工作需要写的一个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中的相等与不等运算
Apr 25 Javascript
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
Sep 16 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
Feb 14 Javascript
javascript cookie的简单应用
Feb 24 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
Mar 13 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
Apr 29 Javascript
微信小程序 判断手机号的实现代码
Apr 19 Javascript
详解Node.js串行化流程控制
May 04 Javascript
五分钟搞懂Vuex实用知识(小结)
Aug 12 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
Oct 29 Javascript
python实现迭代法求方程组的根过程解析
Nov 25 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 方便水印和缩略图的图形类
2009/05/21 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
大家未必知道的Js技巧收藏
2008/04/07 Javascript
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
js三种排序算法分享
2012/08/16 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
Python 获取当前所在目录的方法详解
2017/08/02 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
客户经理岗位职责
2013/12/08 职场文书
红领巾广播站广播稿
2014/02/01 职场文书
委托书的格式
2014/08/01 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL