JavaScript drop 事件

admin發表於2019-10-07

此事件在拖動源元素的滑鼠指標位於目標元素內,並鬆開滑鼠時觸發。

drop事件主要特點簡單羅列如下:

(1).事件處理函式註冊於目標元素之上。

(2).拖動源元素的滑鼠指標位於目標元素之內,並鬆開時觸發。

此事件與dragend事件類似, 兩個事件的主要區別簡述如下:

(1).drop事件處理函式註冊於目標元素,dragend註冊於源元素。

(2).dragend事件只要鬆開滑鼠即可觸發,無論指標在何處。

關於事件處理函式註冊,可以參閱如何註冊事件處理函式一章節。

下面通過一段程式碼例項對此事件進行一下簡單演示:

[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:200px; 
  height:200px;
  background-color:#ccc;
}
.over {
  border: 1px dashed #000;
  transform: scale(0.8, 0.8);
}
</style>
<script>
window.onload = () =>{
  let odiv=document.getElementById("box");
  let op=document.getElementById("p");

  op.ondragstart = (ev) => {
    ev.dataTransfer.setData("Text",ev.target.id);
  }
  odiv.ondragenter = (ev) => {
    ev.target.classList.add('over');
  }
  odiv.ondragover = (ev) => {
    ev.preventDefault();
  }
  odiv.ondragleave = (ev) => {
    ev.target.classList.remove('over');
  }
  odiv.ondrop = (ev) => {
    ev.preventDefault();
    ev.stopPropagation();
    ev.target.classList.remove('over');
    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>

上述程式碼對拖動效果進行了簡單演示,下面對drop事件進行一下分析。

[JavaScript] 純文字檢視 複製程式碼
odiv.ondrop = (ev) => {
  ev.preventDefault();
  ev.stopPropagation();
  ev.target.classList.remove('over');
  let data=ev.dataTransfer.getData("Text");
  ev.target.appendChild(document.getElementById(data));
}

程式碼分析如下:

(1).事件在拖動源元素的滑鼠指標位於目標元素內,並鬆開滑鼠時觸發。

(2).如果是從作業系統拖動檔案到瀏覽器,那麼會在新標籤開啟資源。

(3).ev.preventDefault()可以阻止上述瀏覽器預設行為,上述例項可以省略此方法。

(4).火狐中,拖動完成時會開啟一個新選項卡,stopPropagation()阻止此現象。

(5).如果目標元素是文字框等表單元素,則無需呼叫stopPropagation(),比如將文字拖入文字框。

(6).ev.target.classList.remove('over')可以將目標元素恢復原狀。

(7). let data=ev.dataTransfer.getData("Text")獲取源元素的id屬性值。

(8).ev.target.appendChild(document.getElementById(data))將源元素追加到目標元素中。

相關文章