JavaScript實現拖放效果

相關重點

DataTransfer 對象:

  • 退拽對象用來傳遞的媒介,使用一般爲Event.dataTransfer。

draggable 屬性:

  • 就是標籤元素要設置draggable=true,否則不會有效果,例如:
<div title="拖拽我" draggable="true">列表1</div>

Event.preventDefault() 方法:

  • 阻止默認的些事件方法等執行。在ondragover中一定要執行preventDefault(),否則ondrop事件不會被觸發。另外,如果是從
  • 其他應用軟件或是文件中拖東西進來,尤其是圖片的時候,默認的動作是顯示這個圖片或是相關信息,並不是真的執行drop。
  • 此時需要用用document的ondragover事件把它直接幹掉。Event.effectAllowed 屬性:就是拖拽的效果
事件 產生事件的元素 描述
dragstart 被拖放的元素 開始拖放操作
drag 被拖放的元素 拖放過程中
dragenter 拖放過程中鼠標經過的元素 被拖放元素開始進入本元素的範圍內
dragover 拖放過程中鼠標經過的元素 被拖放元素正在本元素範圍內移動
dragleave 拖放過程中鼠標經過的元素 被拖放元素離開本元素的範圍
drop 拖放的目標元素 有其他元素被拖放到本元素中
dragend 拖放的對象元素 這裏寫代碼片拖放操作結束
屬性 描述
dropEffect 表示拖放操作的視覺效果,允許對其進行值的設定。該效果必須在用effectAllowed屬性指定的允許的視覺效果範圍內,允許指定的值有:none、copy、link、move。
effectAllowed 用來指定當元素被拖放時所允許的視覺效果。可以指定的值有:none、copy、copyLink、copyMove、link、linkMove、all、uninitialize。
files 返回表示被拖拽文件的 FileList。
types 存入數據的MIME類型。如果任意文件被拖拽,那麼其中一個類型將會是字符串”Files”。

實例講解

創建一個html文件

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .box{width: 400px;height: 400px;background-color: grey;}
            img{width: 200px;}
        </style>
        <script src="js/ja.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id='box1' class="box"></div>
        <img src="img/8.jpg"/>
        <div class="inter"></div>
    </body>
</html>

第一步的js文件

var $box,$in;
window.οnlοad=function(){
    //ondragenter 事件:當拖曳元素進入目標元素的時候觸發的事件,此事件作用在目標元素上
     $box = document.getElementsByClassName('box')[0];
     $in =document.getElementsByClassName('inter')[0];
    $box.οndragenter=function(e){
        //監聽事件,返回信息
        showOb(e);
    }
}
function showOb(obj){
    //打印事件信息
    var s ='';
    for(var k in obj){
        s += k+':'+obj[k]+'<br/>'
    }
    $in.innerHTML= s;
}

觀看效果

這裏寫圖片描述

1.2.2 dragover事件,用來確定給用戶顯示怎樣的反饋信息。

如果這個事件被取消,反饋信息(通常就是光標)就會基於 dropEffect 屬性的值更新。

第二步修改代碼

var $box,$in;
window.οnlοad=function(){
    //ondragenter 事件:當拖曳元素進入目標元素的時候觸發的事件,此事件作用在目標元素上
     $box = document.getElementsByClassName('box')[0];
     $in =document.getElementsByClassName('inter')[0];
//  $box.οndragenter=function(e){
//      //監聽事件,返回信息
//      showOb(e);
//  }
    $box.ondragover = function(e){
        e.preventDefault()
        //阻止系統默認事件

    }
    $box.ondrop = function(e){


        showOb(e.dataTransfer);
    }
}
function showOb(obj){
    //打印事件信息
    var s ='';
    for(var k in obj){
        s += k+':'+obj[k]+'<br/>'
    }
    $in.innerHTML= s;
}

所求這裏寫圖片描述

最終額js代碼做成可以在兩個div之間拖動的效果

總代碼如下

var $box1,$in,$img1,$box2;
window.οnlοad=function(){
    //ondragenter 事件:當拖曳元素進入目標元素的時候觸發的事件,此事件作用在目標元素上
     $box1 = document.getElementsByClassName('box1')[0];
      $box2 = document.getElementsByClassName('box2')[0];
     $in =document.getElementsByClassName('inter')[0];
     $img1 =document.getElementById('img1')
//  $box.οndragenter=function(e){
//      //監聽事件,返回信息
//      showOb(e);
//  }
    $box1.ondragover = function(e){
        e.preventDefault()
        //阻止系統默認事件
    }
    $box2.ondragover = function(e){
        e.preventDefault()
        //阻止系統默認事件
    }
    $img1.οndragstart=function(e){
        e.dataTransfer.setData('imgid','img1');
    }
    $box1.ondrop = function(e){
//      showOb(e.dataTransfer);
        e.preventDefault();
        //創建節點
        var img = document.getElementById(e.dataTransfer.getData('imgid'))
//      $box1.appendChild(img)
        //上面是在一個區域拖動,爲了實現多個區域拖動我們進行如下修改
        e.target.appendChild(img)

    }
    $box2.ondrop = function(e){
        e.preventDefault();
        //創建節點
        var img = document.getElementById(e.dataTransfer.getData('imgid'))
//      $box2.appendChild(img)
        //上面是在一個區域拖動,爲了實現多個區域拖動我們進行如下修改
        e.target.appendChild(img)

    }
}
function showOb(obj){
    //打印事件信息
    var s ='';
    for(var k in obj){
        s += k+':'+obj[k]+'<br/>'
    }
    $in.innerHTML= s;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章