js拖拽
采用简单的闭包实现方式
/**
* Created with JetBrains WebStorm.
* User: lsj
* Date: 12-11-24
* Time: 下午12:59
* To change this template use File | Settings | File Templates.
*/
var dragmanager=(function()
{
//标识移动元素z轴坐标
var index_z=1;
//当前的拖拽元素
var drganow;
//移动标识符号
var dragbegin=false;
//鼠标点击时距离div左边距离
var relativex=0;
//鼠标点击时距离div上边距离
var relativey=0;
//标识鼠标是否移出
var isout=false;
return {
/**
* 为document绑定鼠标提起事件,主要防止鼠标移动过快跳出el区域
*/
bingDocOnMouseUp:function()
{
//注册全局的onmouseup事件,主要防止鼠标移动过快导致鼠标和el不同步
document.onmouseup=function(e)
{
var ev = window.event || e;
if(isout && dragbegin)
{
//改变div的相对位置
drganow.style.left= (ev.clientX-relativex)+'px';
drganow.style.top=(ev.clientY-relativey)+'px';
drganow.style.cursor='normal';
dragbegin=false;
isout=false;
}
}
},
/**
* 将注入的元素绑定事件
* @param el
*/
registerElementEv:function(element)
{
element.onmousedown=function(e)
{
var ev = window.event || e;
var clientx=ev.clientX;
var clienty= ev.clientY;
var left= parseInt(this.style.left.substring(0, this.style.left.indexOf("p")));
var top= parseInt(this.style.top.substring(0, this.style.top.indexOf("p")));
relativex=clientx-left;
relativey=clienty-top;
index_z++;
this.style.zIndex=index_z;
drganow=this;
dragbegin=true;
}
element.onmousemove=function(e)
{
var ev = window.event || e;
//开始拖拽
if(dragbegin)
{
//改变div的相对位置
this.style.left= (ev.clientX-relativex)+'px';
this.style.top=(ev.clientY-relativey)+'px';
this.style.cursor='move';
}
}
element.onmouseout=function(e)
{
isout=true;
}
element.onmouseup=function(e)
{
var ev = window.event || e;
if(dragbegin)
{
//改变div的相对位置
drganow.style.left= (ev.clientX-relativex)+'px';
drganow.style.top=(ev.clientY-relativey)+'px';
drganow.style.cursor='normal';
dragbegin=false;
}
}
}
}
})();
1.采用闭包的形式实现 ,方便后期的维护,将移动过程所需的变量全部转移进gridmanager里面
2.拖拽过程中 鼠标移动过快导致移动元素跟不上鼠标的移动,所以要注册document.oumouseup事件,该事件的开关是有移动元素的onmouseout事件触发的
3.拖拽的过程中可能会触发浏览器自身的onmousemove的select事件,可以进行屏蔽ie下是onmousemove="document.selection.empty()"
分享到:
相关推荐
深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系
本文主要介绍了JavaScript利用闭包实现模块化的方法。具有一定的参考价值,下面跟着小编一起来看下吧
闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...
网上大多只是讲解js闭包的大概意思和小例子,但真实用于项目中又该怎么用呢。这个例子真实的告诉大家在项目中的用法
闭包一点即通 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
即使JavaScript中没有正式的私有对象属性的概念,但可以使用闭包来实现公有方法,而通过公有方法可以访问在包含作用域中定义的变量; 有权访问私有变量的公有方法叫做特权方法; 可以使用构造函数模式、原型模式...
本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。
C语言实现三种闭包算法,能够实现传递,自反,对称闭包
js拖拽 采用简单的闭包实现方式 代码如下: /** * Created with JetBrains WebStorm. * User: lsj * Date: 12-11-24 * Time: 下午12:59 * To change this template use File | Settings | File Templates. */ var ...
js闭包 • 每个函数都有一个包含词法环境的执行上下文,它的词法环境确定了函数内的变量赋值以及对外部环境的引用。看上去函数“记住”了外部环境,但其实上是这个函数有个指向外部环境的引用。这就是“闭包”的...
Javascript 闭包完整解释
本Demo采用Swift语言利用Closure闭包实现两个视图控制器的反向传值,和OC中的Blocks类似,但有些区别。
JavaScript闭包 JavaScript闭包 JavaScript闭包 JavaScript闭包
js闭包的详细讲解
以闭包的形式设计实现ztree增删改查,提高节点的查询以及操作,包括对节点排序操作,仅供参考,希望给需要的朋友带来帮助,谢谢支持!
主要介绍了JS实现闭包中的沙箱模式,结合实例形式分析了闭包模块化实现沙箱模式的原理、步骤与相关操作技巧,需要的朋友可以参考下
js闭包的个人理解
JS闭包可被利用的常见场景。值得保留的文档。值得一看
javascript原型和闭包