js實現(xiàn)拖拽 閉包函數(shù)詳細介紹
更新時間:2012年11月25日 12:53:40 作者:
在開發(fā)過程中可能會使用js實現(xiàn)拖拽等相關(guān)功能,本文將以此問題進行深入介紹,需要了解的朋友可以參考下
js拖拽
采用簡單的閉包實現(xiàn)方式
/**
* 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;
//當(dāng)前的拖拽元素
var drganow;
//移動標識符號
var dragbegin=false;
//鼠標點擊時距離div左邊距離
var relativex=0;
//鼠標點擊時距離div上邊距離
var relativey=0;
//標識鼠標是否移出
var isout=false;
return {
/**
* 為document綁定鼠標提起事件,主要防止鼠標移動過快跳出el區(qū)域
*/
bingDocOnMouseUp:function()
{
//注冊全局的onmouseup事件,主要防止鼠標移動過快導(dǎo)致鼠標和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.采用閉包的形式實現(xiàn) ,方便后期的維護,將移動過程所需的變量全部轉(zhuǎn)移進gridmanager里面
2.拖拽過程中 鼠標移動過快導(dǎo)致移動元素跟不上鼠標的移動,所以要注冊document.oumouseup事件,該事件的開關(guān)是有移動元素的onmouseout事件觸發(fā)的
3.拖拽的過程中可能會觸發(fā)瀏覽器自身的onmousemove的select事件,可以進行屏蔽ie下是onmousemove="document.selection.empty()"
采用簡單的閉包實現(xiàn)方式
復(fù)制代碼 代碼如下:
/**
* 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;
//當(dāng)前的拖拽元素
var drganow;
//移動標識符號
var dragbegin=false;
//鼠標點擊時距離div左邊距離
var relativex=0;
//鼠標點擊時距離div上邊距離
var relativey=0;
//標識鼠標是否移出
var isout=false;
return {
/**
* 為document綁定鼠標提起事件,主要防止鼠標移動過快跳出el區(qū)域
*/
bingDocOnMouseUp:function()
{
//注冊全局的onmouseup事件,主要防止鼠標移動過快導(dǎo)致鼠標和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.采用閉包的形式實現(xiàn) ,方便后期的維護,將移動過程所需的變量全部轉(zhuǎn)移進gridmanager里面
2.拖拽過程中 鼠標移動過快導(dǎo)致移動元素跟不上鼠標的移動,所以要注冊document.oumouseup事件,該事件的開關(guān)是有移動元素的onmouseout事件觸發(fā)的
3.拖拽的過程中可能會觸發(fā)瀏覽器自身的onmousemove的select事件,可以進行屏蔽ie下是onmousemove="document.selection.empty()"
您可能感興趣的文章:
相關(guān)文章
sortable中el-table拖拽及點擊箭頭上下移動row效果
這篇文章主要介紹了sortable中el-table拖拽及點擊箭頭上下移動row效果,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-08-08
javascript Firefox與IE 替換節(jié)點的方法
Firefox 與 IE 替換節(jié)點的方法2010-02-02
淺談SpringMVC中post checkbox 多選框value的值(隱藏域方式)
下面小編就為大家分享一篇淺談SpringMVC中post checkbox 多選框value的值(隱藏域方式),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
JavaScript動態(tài)創(chuàng)建link標簽到head里的方法
這篇文章主要介紹了JavaScript動態(tài)創(chuàng)建link標簽到head里的方法,分別介紹了使用jQuery的方法、使用原生javascript方法與IE特有的createStyleSheet方法等,非常具有實用價值,需要的朋友可以參考下2014-12-12
JavaScript股票的動態(tài)買賣規(guī)劃實例分析下篇
這篇文章主要介紹了JavaScript對于動態(tài)規(guī)劃解決股票問題的真題例舉講解。文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
JavaScript中創(chuàng)建對象的7種模式詳解
本文主要介紹了JavaScript中創(chuàng)建對象的7種模式,具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02
JavaScript實現(xiàn)計算字符串中出現(xiàn)次數(shù)最多的字符和出現(xiàn)的次數(shù)
這篇文章主要介紹了JavaScript實現(xiàn)計算字符串中出現(xiàn)次數(shù)最多的字符和出現(xiàn)的次數(shù),本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-03-03

