天天看點

事件的拖拽一

/*

* 拖拽的流程

* 1、當滑鼠在被拖拽元素上按下時,開始拖拽 onmousedown

* 2、當滑鼠移動時被拖拽元素跟随滑鼠移動onmousemove

* 3、當滑鼠松開時,被拖拽函數固定在目前位置 onmouseup

*/

具體實作流程:

          //擷取box1
                box1 = document.getElementById("box1");
                //為box1綁定按下事件
                box1.onmousedown = function(){
                    //為document綁定一個移動元素,這樣子我滑鼠放在任何地方都可以,如果給box1綁定,隻有放box才可以。
                    document.onmousemove = function(event){
                        //相容性
                        event = event || window.event;
                        //擷取滑鼠的坐标
                        var left = event.clientX;
                        var top = event.clientY;
                        //修改div的坐标
                        box1.style.left = left + "px";
                        box1.style.top = top + "px";
                        //為docment綁定一個1onmouseup,不能為div綁定,如果有多一個div的話
                        //移動到下一個div同位置的話,釋放滑鼠是沒有釋放事件的,因為作用于另外一個div了
                        //是以要綁定docment對所有的都有用。
                        //當滑鼠松開的時候,就取消移動事件和松開事件
                        document.onmouseup = function(){
                            document.onmousemove = null;
                            document.onmouseup = null;
                        }
                    }
                    
                }      

 以上是比較簡單的情況下,沒有考慮到其他的影響下的情況,如果多一個div和文字的話,則需要考慮如下情況

1、/*

* 當我們去拖拽一個内容時,浏覽器會預設去搜尋引擎中搜尋内容,

* 此時會導緻拖拽功能的異常,這個是浏覽器提供的一個預設行為,

* 如果不希望發生這個行為,則可以通過return false取消預設行為

* 但是這招對IE8不起作用,

*

*/

普通浏覽器可以使用return false解決,但是IE8則需要使用捕獲來操作,但是捕獲對chorm等浏覽器不支援,是以也要判斷,類似event

//設定box1捕獲所有滑鼠按下的事件,就是按了别人,也是作用于box1,這樣子文字那些就不會跟随變化了

/*setCapture()

* z隻有IE支援,但是在火狐中調用時不會報錯

* 在chorme會報錯

* 那就需要判斷是不是有該屬性

* box1.setCapture();

* 如果存在該屬性,就執行該方法,也可以使用if條件判斷

* 就是這個實作就是按下box1的話,文字不會被拖拽,都會拖box1了

判斷條件如下

box1.setCapture && box1.setCapture();      

2、

//但是由于點選div中間,原點也會預設在中間,div的左上角就會跳到滑鼠的位置,

//現在要實作,div不随滑鼠的位置而改變原點,則需要減去d滑鼠在div的左上的長度就可以實作不變了

var ol = event.clientX - box1.offsetLeft;
var ot = event.clientY - box1.offsetTop;      

這樣子就解決了兩個問題,如果要對div操作拖拽或者更多圖檔等,則把該方法包裝成功方法,傳obj參數即可。

具體代碼如下

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #box1{
                width: 100px;
                height: 100px;
                background: red;
                position: absolute;
            }
            #box2{
                width: 100px;
                height: 100px;
                background: yellow;
                position: absolute;
                left: 100px;
                top: 100px;
            }
        </style>
        <script type="text/javascript">
            window.onload = function(){
                box1 = document.getElementById("box1");
                box1.onmousedown = function(event){
                    
                    event = event || window.event;
                    var ol = event.clientX - box1.offsetLeft;
                    var ot = event.clientY - box1.offsetTop;
                    //設定box1捕獲所有滑鼠按下的事件,就是按了别人,也是作用于box1,這樣子文字那些就不會跟随變化了
                    /*setCapture()
                     * z隻有IE支援,但是在火狐中調用時不會報錯
                     * 在chorme會報錯
                     * 那就需要判斷是不是有該屬性
                     * box1.setCapture();
                     * 如果存在該屬性,就執行該方法,也可以使用if條件判斷
                     * 就是這個實作就是按下box1的話,文字不會被拖拽,都會拖box1了
                     * 
                     */
                    box1.setCapture && box1.setCapture();
                    
                    
                    document.onmousemove = function(event){
                        event = event || window.event;
                        
                        
                        
                        //但是由于點選div中間,原點也會預設在中間,div的左上角就會跳到滑鼠的位置,
                        //現在要實作,div不随滑鼠的位置而改變原點,則需要減去d滑鼠在div的左上的長度就可以實作不變了
                        var left = event.clientX - ol;
                        var top = event.clientY - ot;
                        
                        box1.style.left = left+"px";
                        box1.style.top = top+"px";
                    }
                    document.onmouseup = function(){
                        document.onmousemove = null;
                        document.onmouseup = null;
                        //釋放捕獲 box1.releaseCapture();
                        box1.releaseCapture && box1.releaseCapture();
                        
                    }
                    
                    /*
                     * 當我們去拖拽一個内容時,浏覽器會預設去搜尋引擎中搜尋内容,
                     * 此時會導緻拖拽功能的異常,這個是浏覽器提供的一個預設行為,
                     * 如果不希望發生這個行為,則可以通過return false取消預設行為
                     * 但是這招對IE8不起作用,
                     * 
                     */
                    return false
                    
                }
            }
            
        </script>
    </head>
    <body>
        <p>我是一段文字</p>
        <div id="box1"></div>
        //如果要給box2也給拖拽,就把檔案設定為一個函數,給多個使用
        <div id="box2">
            
        </div>
    </body>
</html>      
下一篇: 延時調用