一个原生的JavaScript拖动方法

代码:

 1 function drag(t,p){
 2
 3     var point = p || null,
 4         target = t || null,
 5         resultX = 0,
 6         resultY = 0;
 7
 8     (!point)? point = target : ‘‘; //如果没有拖动点,则拖动点默认为整个别拖动元素
 9
10     function getPos(t){
11         var offsetLeft = 0,
12             offsetTop = 0,
13             offsetParent = t;
14
15         while(offsetParent){
16             offsetLeft+=offsetParent.offsetLeft;
17             offsetTop+=offsetParent.offsetTop;
18             offsetParent = offsetParent.offsetParent;
19         }
20
21         return {‘top‘:offsetTop,‘left‘:offsetLeft};
22     }
23
24     function core(){
25
26         var width = document.body.clientWidth || document.documentElement.clientWidth,
27             height = document.body.clientHeight || document.documentElement.clientHeight;
28             maxWidth = width - target.offsetWidth,
29             maxHeight = height - target.offsetHeight;
30
31         (resultX >= maxWidth)?  target.style.left = maxWidth+‘px‘ :  (resultX > 0)?target.style.left = resultX +‘px‘: ‘‘; //重置默认位置。
32         (resultY >= maxHeight)?   target.style.top = maxHeight +‘px‘ : (resultY > 0)?target.style.top = resultY +‘px‘:‘‘; //重置默认位置。
33
34         point.onmousedown=function(e){
35             var e = e || window.event,
36                 coordX = e.clientX,
37                 coordY = e.clientY,
38                 posX = getPos(target).left,
39                 posY = getPos(target).top;
40
41             point.setCapture && point.setCapture();    //将Mouse事件锁定到指定元素上。
42             document.onmousemove=function(e){
43
44                 var ev = e || window.event,
45                     moveX = ev.clientX,
46                     moveY = ev.clientY;
47
48                 resultX = moveX - (coordX - posX); //结果值是坐标点减去被拖动元素距离浏览器左侧的边距
49                 resultY = moveY - (coordY - posY);
50
51                 (resultX > 0 )?((resultX < maxWidth)?target.style.left = resultX+‘px‘ : target.style.left = maxWidth+‘px‘) : target.style.left = ‘0px‘;
52                 (resultY > 0 )?((resultY < maxHeight)?target.style.top = resultY+‘px‘ : target.style.top = maxHeight+‘px‘) : target.style.top = ‘0px‘;
53
54                 ev.stopPropagation && ev.stopPropagation();
55                 ev.preventDefault;
56                 ev.returnValue = false;
57                 ev.cancelBubble = true;
58             };
59         };
60         document.onmouseup=function(){    // 解决拖动时,当鼠标指向的DOM对象非拖动点元素时,无法触发拖动点的onmousedown的BUG。
61             document.onmousemove = null;
62             point.releaseCapture && point.releaseCapture();    // 将Mouse事件从指定元素上移除。
63         };
64         point.onmouseup=function(e){
65             var e = e || window.event;
66             document.onmousemove = null;
67             point.releaseCapture && point.releaseCapture();
68         };
69     }
70     core();
71     window.onresize = core;
72 }

使用方式:

1 drag(t,p)
2 /*
3  * 说明
4  * t 表示被拖动的元素
5  * p 表示拖动点
6 */
7
8 // 注意:如果省略拖动点,默认可拖动的区域是整个被拖动元素

时间: 2024-10-08 04:37:57

一个原生的JavaScript拖动方法的相关文章

原生JS实现拖动方法

function Drop(id){ var obj = document.getElementById(id), H = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight, W = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, maxWi

JavaScript原生对象属性和方法详解——Array对象 转载

length 设置或返回 数组中元素的数目. 注意:设置 length 属性可改变数组的大小.如果设置的值比其当前值小,数组将被截断,其尾部的元素将丢失.如果设置的值比它的当前值大,数组将增大,新的元素被添加到数组的尾部,它们的值为 undefined.所以length不一定代表数组的元素个数. var arr = new Array(3) arr[0] = "John" arr[1] = "Andy" arr[2] = "Wendy" cons

javascript获取数组最后一个元素(三种方法)

JavaScript 获取Array末尾元素 一.JavaScript pop() 方法 pop() 方法用于删除并返回数组的最后一个元素. 注意:pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值.如果数组已经为空,则 pop() 不改变数组,并返回 undefined 值. var arr = new Array("js","JavaScript","jQuery"); var end

Ext JS学习第十天 Ext基础之 扩展原生的javascript对象(二)

此文来记录学习笔记: 今天继续说Ext.Array,Ext.Function,Ext.Date,Ext.Error ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Ext.Ar

Ext JS学习第九天 Ext基础之 扩展原生的javascript对象

此文来记录学习笔记: •Ext对于原生的javascript对象进行了一系列的扩展,我们把他们掌握好,更能深刻的体会Ext的架构,从而对我们的web开发更好的服务, 源码位置,我们可以从开发包的这个位置找到这几个扩展的js源码: •extjs-4.1.1\src\core\src\lang\ •ExtJS扩展原生Javascript –Ext.Object –Ext.Number –Ext.String –Ext.Array –Ext.Function –Ext.Date –Ext.Error

转载 -- 基于原生JS与OC方法互相调用并传值(附HTML代码)

最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点就是方法的互相调用而已. 本文叙述下如何进行原生的JavaScript交互 本文包括JS调用OC方法并传值,OC调用JS方法并传值 本来想把html放进服务器里面,然后访问,但是觉得如果html在本地加载更有助于理解,特把html放进项目里 HTML代码 <!DOCTYPE html> <html> <head> <meta charset=&

抛弃jQuery 深入原生的JavaScript

学习如何更好的将纯JavaScript用于工作中,而不总是将jQuery考虑在第一位.现在我每天学习很多东西.这个过程让我觉得Adtile的JavaScript SDK 更像是在创建一个开源工程,而不是"具体的工作",不得不说,我很喜欢那样. 今天,我准备将在过去几年学到的一些基础东西与大家一起分享,这将可能帮你深入纯 JavaScript的世界,让你能更简单的做出决定--jQuery在你下个工程中是否需要. 逐步增强 虽然像jQuery这样的库有助于解决许多浏览器之间不兼容的问题,但

抛弃jQuery,深入原生的JavaScript

虽然我已经做网站建设工作10多年了,但我从最近3年才开始更多地学习如何更好的将纯JavaScript用于工作中,而不总是将jQuery考虑在第一位.现在我每天学习很多东西.这个过程让我觉得Adtile的JavaScript SDK 更像是在创建一个开源工程,而不是"具体的工作",不得不说,我很喜欢那样. 今天,我准备将在过去几年学到的一些基础东西与大家一起分享,这将可能帮你深入纯 JavaScript的世界,让你能更简单的做出决定--jQuery在你下个工程中是否需要. 逐步增强 虽然

异步处理XML异步数据——以原生的JavaScript与jQuery中的$.ajax()为例

此文档解决以下问题: 一.原生的JavaScript从服务器端输出XML格式数据 1.XMLHttpRequest对象的运用 XMLHttpRequest对象的open()方法 XMLHttpRequest对象的send()方法 XMLHttpRequest对象的onreadystatechange事件运用 XMLHttpRequest对象的readyState属性 XMLHttpRequest对象的status属性 XMLHttpRequest对象的responseXML属性 2.docume