Javascript拖動管理對象

   在做頁面開發的時候,使用Javascript拖動DOM元素是常見的一種操作,每次對於拖動都要檢測元素的onmousedown、onmousemove、onmouseup三個事件,並分別處理各種事件響應,對於這樣通用的操作,就可以寫一個拖動管理類來實現元素拖動的邏輯!

  下面的代碼使用了事件管理對象JEvent,JEvent的代碼參見上一篇日誌JEvent事件處理

/*
 *功能:拖動元素
 *Author:LQB
 *時間:2009-1-7
 * #include JEvents
*/
 var JDrag = function(){
        this.src_element = null;//觸發的元素
        this.src_top = 0;       //src_element的top
        this.src_left = 0 ;     //src_element的left
        this.src_right = 0 ;    //src_element的right
        this.src_bottom = 0;    //src_element的bottom
        this.src_width = 0;     //src_element的width
        this.src_height = 0;    //src_element的height
        this.src_mouseX = 0;    //源X座標
        this.src_mouseY = 0;    //源Y座標
        this.src_Event = null;  //源事件
        
        this.offsetX = 0;       //事件座標X偏移量
        this.offsetY = 0;       //事件座標Y偏移量
        this.eventX = 0;        //事件座標X
        this.eventY = 0;        //事件座標Y
        this.offsetEvent = null;//事件
        
        var m_isMoveing = false; 
        var m_me = this;        //用於私有成員訪問公有成員 
        /*--------------------------------以下是事件------------------------------*/
        var m_events=null;//事件對象
        var InitEvent = function(){
            m_events = new JEvents();
            m_events.addEvent("dragstart","draging","dragend");//添加事件
        }
        var m_addListener = function(eName,fn,scope){
            if(typeof(fn)!= "function"){
                throw "Event handle must be function!";
            }
            m_events.addListener(eName,fn,scope);
        };
        var m_fireEvent = function(eName){
            m_events.fireEvent(eName);
        }
        //以下三個方法是對外的事件委託
        this.οndragstart=function(fn,scope){
            m_addListener("dragstart",fn,scope);
        };
        this.ondraging=function(fn,scope){
            m_addListener("draging",fn,scope);
        };
        this.οndragend=function(fn,scope){
            m_addListener("dragend",fn,scope);
        };
        /*--------------------------------事件完畢--------------------------------*/
        //公有方法       
        this.DragStart = function(e){
            var event = window.event || e;
            if(event.srcElement)
                this.src_element = event.srcElement;
            else
                this.src_element = event.target;
            
            this.src_top = this.src_element.style.top;
            this.src_left = this.src_element.style.left;
            this.src_right = this.src_element.style.right;
            this.src_bottom = this.src_element.style.bottom;
            this.src_width =  parseInt(this.src_element.style.width);
            this.src_height = parseInt(this.src_element.style.height);

            this.src_Event = event;
            this.src_mouseX = event.clientX;
            this.src_mouseY = event.clientY;
            m_isMoveing = true;
            
            //爲了平滑移動效果,把MOUSEMOVE事件的捕獲交給document
            if(this.src_element.setCapture){
                this.src_element.setCapture();
                JEvents.bind(this.src_element,"onmousemove",this.Draging,this);
                JEvents.bind(this.src_element,"onmouseup",this.DragEnd,this);
            }
            else if(window.captureEvents){
                window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
                JEvents.bind(document,"onmousemove",this.Draging,this);
                JEvents.bind(document,"onmouseup",this.DragEnd,this);
            }
            m_fireEvent("dragstart");//觸發開始拖動事件
                
        };
        this.Draging = function(e){
            if(m_isMoveing){
                var event = window.event || e;
                this.offsetX = event.clientX - this.src_mouseX;
                this.offsetY = event.clientY - this.src_mouseY;
                this.eventX = event.clientX;
                this.eventY = event.clientY;
                this.offsetEvent = event;
                m_fireEvent("draging");//觸發拖動事件
            }
        }
        this.DragEnd = function(e){
            if(m_isMoveing){
                //爲了平滑移動效果,把MOUSEMOVE事件的捕獲交給document
                if(this.src_element.releaseCapture){
                    this.src_element.releaseCapture();
                    JEvents.unbind(this.src_element,"onmousemove",this.Draging);
                    JEvents.unbind(this.src_element,"onmouseup",this.DragEnd);
                }
                else if(window.captureEvents){
                    window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
                    JEvents.unbind(document,"onmousemove",this.Draging); 
                    JEvents.unbind(document,"onmouseup",this.DragEnd);
                }
                m_fireEvent("dragend");//觸發結束拖動事件
                reset();
            }
        }
        var reset = function(){
            m_isMoveing = false;
            m_me.offsetEvent=null;
            m_me.src_Event = null;
            m_me.src_element=null;
            m_me.src_top = 0;
            m_me.src_left = 0;
            m_me.src_right = 0;
            m_me.src_bottom = 0;
            m_me.src_width = 0;
            m_me.src_height = 0;
            m_me.src_mouseX = 0;
            m_me.src_mouseY = 0;
            m_me.offsetX = 0;
            m_me.offsetY = 0;
            m_me.eventX = 0;
            m_me.eventY = 0;
        }
        /*-------------------------以下是構造方法---------------------------------*/
        InitEvent();
        /*-------------------------構造方法完成-----------------------------------*/
   }

關於JDrag的調用,可以參考以下代碼:

var DragSimple=function(el){
    var m_Drag = null;
    var InitDrag = function(){
        m_Drag = new JDrag();
        m_Drag.ondragstart(Drag_start,m_me);     //開始拖拽
        m_Drag.ondraging(Drag_ing,m_me);         //拖拽中
        m_Drag.ondragend(Drag_end,m_me);         //拖拽結束
    }; 
    var Drag_start=function(){
        };
    var Drag_ing=function(){
     if(m_Drag.eventX >= m_Drag.src_mouseX){//向右移動
            if(m_Drag.eventY>=m_Drag.src_mouseY){//向右下移動
         //拖動處理代碼
	   }
     }
        };
    var Drag_end=function(){
       };
    InitDrag();
    JEvents.bind(el,"onmousedown",m_Drag.DragStart,m_Drag);//當mousedown時觸發拖拽對象,開始拖動
}
發佈了34 篇原創文章 · 獲贊 1 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章