dataTransfer.dropEffect 屬性

admin 發表於2019-10-09

此屬性用於規定或者返回目標元素期望的拖拽操作的型別,可讀寫屬性。

通常與DataTransfer.effectAllowed 屬性配合使用:

(1).effectAllowed屬性規定源元素期待的拖拽型別。

(2).dropEffect屬性規定目標元素期待的拖拽型別。

關於dropEffect屬性可以參閱DataTransfer.effectAllowed 屬性一章節。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
dataTransfer.effectAllowed=effectString

屬性值解析如下:

(1).copy:目標元素期待拷貝相關拖拽操作。

(2).move:目標元素期待移動相關拖拽操作。

(3).link:目標元素期待連結相關拖拽操作。

(4).none:不允許進行拖拽操作。

此屬性主要特點簡單總結如下:

(1).在dragover事件處理函式中定義。

(2).與dropEffect 屬性配合使用,具有相互限定的功能。

(3).實際操作與期望的操作並不一定相同。

程式碼例項如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style type="text/css">
p{
  width:100px;
  height:50px;
  background-color:red;
}
#box {
  width:300px; 
  height:100px;
  background-color:#ccc;
}
</style>
<script>
window.onload = (ev) => {
  let odiv=document.getElementById("box");
  let op=document.getElementById("p");
  
  op.ondragstart = (ev) => {
    ev.dataTransfer.setData("Text",ev.target.id);
    ev.dataTransfer.effectAllowed="copy";
  }
  
  odiv.ondragover = (ev) => {
    ev.preventDefault();
    ev.dataTransfer.dropEffect="link";
  }
  
  odiv.ondrop = (ev) => {
    ev.preventDefault();
    ev.stopPropagation();
    let data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
  }
   
}
</script>
</head>
<body>
<p draggable="true" id="p"></p>
<div id="box"></div>
</body>
</html>

上面的程式碼並不能完成拖動操作,下面進行一下分析:

在dragstart事件處理函式中,設定effectAllowed屬性值為"copyMove"。

也就是說源元素的期待拖拽操作與拷貝或者移動相關。

在dragover事件處理函式中,設定dropEffect屬性值為"link"。

也就是說目標元素的期待拖拽操作是與連線相關,並不在effectAllowed許可範圍之內。

比如將dropEffect屬性值設定為"move",那麼可以實現拖拽操作。

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style type="text/css">
p{
  width:100px;
  height:50px;
  background-color:red;
}
#box {
  width:300px; 
  height:100px;
  background-color:#ccc;
}
</style>
<script>
window.onload = (ev) => {
  let odiv=document.getElementById("box");
  let op=document.getElementById("p");
  
  op.ondragstart = (ev) => {
    ev.dataTransfer.setData("Text",ev.target.id);
    ev.dataTransfer.effectAllowed="copy";
  }
  
  odiv.ondragover = (ev) => {
    ev.preventDefault();
    ev.dataTransfer.dropEffect="copy";
  }
  
  odiv.ondrop = (ev) => {
    ev.preventDefault();
    ev.stopPropagation();
    let data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
  }
}
</script>
</head>
<body>
<p draggable="true" id="p"></p>
<div id="box"></div>
</body>
</html>

上述程式碼同樣可以實現拖放操作。

可以看到,期望的是實現拷貝操作,但實際進行的是移動操作。

也就是說,具體的操作內容由事件處理函式中的具體程式碼決定。

只要dropEffect在effectAllowed許可範圍之內,即可實現拖拽效果。