工作需要写的一个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经典效果集锦
Jul 06 Javascript
jquery lazyload延迟加载技术的实现原理分析
Jan 24 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
Jul 09 Javascript
gridpanel动态加载数据的实例代码
Jul 18 Javascript
javascript中定义私有方法说明(private method)
Jan 27 Javascript
使用JavaScript链式编程实现模拟Jquery函数
Dec 21 Javascript
javascript面向对象之访问对象属性的两种方式分析
Jan 13 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
jquery实现叠层3D文字特效代码分享
Aug 21 Javascript
javascript实现下雪效果【实例代码】
May 03 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
Aug 01 Javascript
Vue CLI3 如何支持less的方法示例
Aug 29 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环境――Appserv
2006/12/13 PHP
adodb与adodb_lite之比较
2006/12/31 PHP
让PHP支持页面回退的两种方法
2008/01/10 PHP
php中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
PHP中比较时间大小实例
2014/08/21 PHP
10条php编程小技巧
2015/07/07 PHP
详谈PHP编码转换问题
2015/07/28 PHP
js 设置选中行的样式的实现代码
2010/05/24 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
学习Vue组件实例
2018/04/28 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
对python Tkinter Text的用法详解
2018/10/11 Python
python列表使用实现名字管理系统
2019/01/30 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
区长工作作风个人整改措施
2014/10/01 职场文书
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python
python_tkinter事件类型详情
2022/03/20 Python
关于EntityWrapper的in用法
2022/03/22 Java/Android
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技