JavaScript dragstart 事件

admin發表於2019-10-06

此事件會在源元素開始被拖拽時觸發,註冊於源元素之上,從作業系統向瀏覽器拖拽資料不會觸發。

dragstart事件處理函式中常見的操作和注意點羅列如下:

(1).DataTransfer物件大多數配置在此事件處理函式中完成。

(2).不能在事件處理函式中呼叫preventDefault()方法,否則無法拖動。

(3).此事件觸發後,其他非HTML5標準拖拽滑鼠事件將不會觸發,比如mouseover和mousemove等。

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

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

[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 = () =>{
  let odiv=document.getElementById("box");
  let op=document.getElementById("p");

  op.ondragstart = (ev) => {
    ev.dataTransfer.setData("Text",ev.target.id);
  }

  odiv.ondragover = (ev) => {
    ev.preventDefault();
  }

  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。

[JavaScript] 純文字檢視 複製程式碼
op.ondragstart = (ev) => {
  ev.dataTransfer.setData("Text",ev.target.id);
}

當頂部紅色元素開始拖動時觸發dragstart事件。

在此事件處理函式中,可以對DataTransfer物件進行相關配置。

比如可以傳遞資料,上述程式碼通過setData()方法將源元素的id屬性值儲存起來。

特別說明:setData()方法只能在dragstart事件處理函式中呼叫,否則無效。

也可以在事件處理函式中通過effectAllowed設定可以允許的拖拽行為。

從作業系統向瀏覽器拖拽檔案不會觸發此事件:

這一點非常好理解,因為從作業系統向瀏覽器拖拽檔案操作,一開始無法獲取檔案。

比如我們可以通過document.getElementById()方法獲取文件內源元素,但是如何獲取作業系統上的源元素呢。

關於從作業系統向瀏覽器拖拽檔案可以參閱JavaScript 向瀏覽器拖入圖片預覽一章節。

相關文章