HTML5拖放API


1、  開啟拖放

          將將要拖放的對象元素的draggable屬性設置為true,任何元素均可實現拖放,但img與a元算(必須制定href)默認允許拖放。

2、與拖放相關的事件
事件 產生事件的元素 描述
dragstart 被拖放的元素 開始拖放操作
drag 被拖放的元素 拖放過程中
dragenter 拖放過程中鼠標經過的元素 被拖放的元素開始進入本元素的范圍內
dragover 拖放過程中鼠標經過的元素 被拖放的元素正在本元素的范圍內移動
dragleave 拖放過程中鼠標經過的元素 被拖放的元素離開本元素的范圍
drop 拖放的目標元素 有其他元素被拖放到本元素中
dragend 拖放的對象元素 拖放操作結束

  1. <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title></title>
    <script>
    function init(){
    var source = document.getElementById('dragme');
    var dest = document.getElementById("text");
    //拖動開始
    source.addEventListener("dragstart",function(ev){
    //向dataTransfer對象添加數據
    var dt = ev.dataTransfer;
    dt.effectAllowed = "all";
    //拖動元素為dt.setData("text/plain",this.id);
    dt.setData("text/plain","您好");
    },false);
    //拖放結束
    dest.addEventListener("dragend",function(ev){
    //不執行默認處理(拒絕被拖放)
    ev.preventDefault();
    },false);
    //drop:被拖放
    dest.addEventListener("drop",function(ev){
    //從DataTransfer對象那里取得數據
    var dt = ev.dataTransfer;
    var text = dt.getData("text/plain");
    dest.textContent += text;
    //不執行默認處理(拒絕被拖放)
    ev.preventDefault();
    ev.stopPropagation();
    },false);
    }
    //設置頁面屬性,不執行默認處理(拒絕被拖放)
    document.ondragover = function(e){
    e.preventDefault();
    }
    document.ondrop = function(e){
    e.preventDefault();
    }
    </script>
    </head>
    <body onload="init();">
    <div id="dragme" draggable="true" style="width: 200px;border: 1px solid gray;">
    請拖放
    </div>
    <div id="text" style="width: 200px;height: 200px;border: 1px solid gray;">
    </div>
    </body>
    </html>

     


          針對拖放的目標元素,必須在dragend或dragover事件內調用“事件對象.preventDefault()”方法。因為默認情況下,拖放的目標元素是不允許接受元素的,為了把元素拖放到其中,必須關閉默認處理。
 
         要實現拖放過程,還必須在目標元素的drop事件中關閉默認處理(拒絕被拖放),否則拖放處理也不能實現。因為頁面實現與其他元素接受拖放的,如果頁面上拒絕拖放,那么頁面上其他元素就不能接受拖放了。
 
         要實現拖放過程,還必須設定整個頁面為不執行默認處理(拒絕被拖放),否則被拖放處理也不能實現。因為頁面是先於其他元素接受拖放的,如果頁面上拒絕拖放,那么頁面上其他元素不能接受拖放了。
 
         為了讓拖放在所有支持拖放API的瀏覽器中都能正常運行,需要制定"-webkit-user-drag:element"這種Webkit特有的CSS屬性。
 
3、MIME類型
    ·text/plain:文本文字
     ·text/html:HTML文字
     ·text/xml:XML文字
     ·text/uri-list:URL列表,每個URL為一行
 
4、js的 dataTransfer對象
 
          提供對於預定義的剪貼板格式的訪問,以便在拖拽中使用。
屬性 描述 參數
dropEffect 設置或返回拖放目標上允許發生的拖放行為和要顯示的光標類型
copy 復制樣式被顯示
link  鏈接樣式被顯示
move  移動樣式被顯示
none  默認,沒有鼠標樣式被定義
effectAllowed 設置或返回被拖動元素允許發生的拖動行為與該對象的源元素。
copy 選項被復制
link  選項被dataTransfer作為link方式保存
move  當放置時,對象被移動至目標對象
copylink  選項是被復制還是被作為link方式保存關鍵在於目標對象
linkmove 選項是被作為link方式保存還是被移動關鍵在於目標對象
all 所有效果都被支持
none 不支持任何效果
uninitialized 默認不能通過這個屬性傳遞任何值
types 存入數據的種類,字符串的偽數組  
clearData() 清除DataTransfer對象中存放的數據,如果省略參數format,則清楚全部數據  
setData(format,data) 將指定格式的數據賦值給dataTransfer對象 參數format定義數據的格式也就是數據的類型,data為待賦值的數據
getData(format,data)
從dataTransfer對象中獲取指定格式的數據 format代表數據格式,data為數據。
setDragImage(Element image,long x,long y) 用img元素來設置拖放圖標(部分瀏覽器中可以用canvas等其他元素來設置) element設置自定義圖標,x設置圖標與鼠標在水平方向上的距離,y設置圖標與鼠標在垂直方向上的距離。
         
          effectAllowed定義了在源對象上的操作,可定義在ondragstart事件中。  
          dropEffect定義了在目標對象上的操作,可定義在ondrop,ondragenter,ondragover事件中。  
          effectAllowed可以定義all操作,但是dropEffect可以定義copy操作。
 
5、設定拖放時的視覺效果
         DataTransfer對象的dropEffect屬性表示實際拖放時的視覺效果,一般在ondragover事件中指定,允許設定的值為none、link、move。dropEffect屬性所表示的實際視覺效果必須與effectAllowed屬性值所表示的允許操作相匹配,規則如下所示:
         *如果effectAllowed屬性設定為none,則不允許拖放元素。
          *如果dropEffect屬性設定為none,則不允許拖放元素。
         *如果 effectAllowed 屬性設定為all或不設定,則dropEffect屬性允許被設定為任何值。
          *如果 effectAllowed 屬性設定為具體操作,而dropEffect屬性也設定了具體視覺效果,則dropEffect屬性值必須與effectAllowed屬性值相匹配,否則不允許將被拖放元素拖放到目標元素中。
 
6、自定義拖放圖標
         setDragImage (Element image,long x,long y),第一個參數image是設定拖放圖標的圖標元素,第二個參數x為拖放圖標離鼠標指針的X軸方向的唯一量,第三個參數y為拖放圖標離鼠標指針的y軸方向的位移量。
 
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script>
            function init(){
                var dragIcon = document.createElement("img");
                dragIcon.src ='https://www.baidu.com/img/bdlogo.png';
                var source = document.getElementById('dragme');
                var dest = document.getElementById("text");
                source.addEventListener('dragstart',function(ev){
                    var dt = ev.dataTransfer;
                    dt.setDragImage(dragIcon,-10,-10);
                    dt.effectAllowed = "copy";
                    dt.setData("text/plain","您好");
                },false);
                dest.addEventListener('dragend',function(ev){
                    ev.preventDefault();
                },false);
                dest.addEventListener('dragover',function(){
                    var dt = ev.dataTransfer;
                    dt.dropEffect = "copy";
                    ev.preventDefault();
                },false);
                dest.addEventListener('drop',function(ev){
                    var dt = ev.dataTransfer;
                    var text = dt.getData("text/plain");
                    dest.textContent +=text;
                    ev.preventDefault();
                    ev.stopPropagation();
                },false);
            }
            document.ondragover = function(e){
                e.preventDefault();
            };
            document.ondrop = function(e){
                e.preventDefault();
            }
        </script>
    </head>
    <body onload="init();">
        <div id="dragme" draggable="true" style="width: 200px;border: 1px solid gray;">
            請拖放
        </div>
        <div id="text" style="width: 200px;height: 200px;border: 1px solid gray;">
        
        </div>
    </body>
</html>

 

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM