DataTransfer.types 屬性

admin 發表於2019-10-09

此屬性返回拖拽操作中通過DataTransfer物件傳遞的資料的資料型別或者MIME type。

此資料通常在dragstart事件處理函式中,通過setData()方法設定。

返回一個陣列,陣列中每一個元素代表著拖拽資料中的一個資料型別或者MIME type。

陣列儲存型別的順序與拖動操作中包含的資料順序相同。

特別說明:千萬不要誤認為是返回被拖動資料的資料型別或者MIME type。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
dataTransfer.types

如果拖動操作不涉及資料,那麼返回一個空陣列。

下面通過程式碼例項對此屬性進行一下詳細演示。

[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);
  }
 
  odiv.ondragover = (ev) => {
    ev.preventDefault();
  }
 
  odiv.ondrop = (ev) => {
    console.log(ev.dataTransfer.types);
    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>

上述程式碼可以將頂部矩形拖動底部灰色矩形中。

控制檯執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201910/09/233745zopn20oeezopsw74.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

下面對程式碼執行結果進行一下分析:

(1).拖動的是p元素,千萬不要誤以為是獲取p元素的MIME type。

(2).DataTransfer.types屬性獲取的是通過setData()方法設定的資料MIME type。

(3).由於傳遞的是純文字,所以列印結果是["text/plain"]。

[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">
#box {
  width:300px; 
  height:100px;
  background-color:#ccc;
}
.over {
  border: 1px dashed #000;
  transform: scale(0.8, 0.8);
}
</style>
<script>
window.onload = () =>{
  let odiv=document.getElementById("box");
 
  odiv.ondragenter = (ev) => {
    ev.target.classList.add('over');
  }
  odiv.ondragover = (ev) => {
    ev.preventDefault();
  }
  odiv.ondragleave = (ev) => {
    ev.target.classList.remove('over');
  }
  odiv.ondrop = (ev) => {
    console.log(ev.dataTransfer.types);
    ev.preventDefault();
    ev.stopPropagation();
    ev.target.classList.remove('over');
    let text = ev.dataTransfer.getData('text');
    ev.target.innerHTML=text;
  }
}
</script>
</head>
<body>
<p id="p">螞蟻部落位於青島市南區</p>
<div id="box"></div>
</body>
</html>

上面程式碼可以實現文字的拖動效果,控制檯列印截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201910/09/233904ru37eub0m9ucc3u9.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

執行結果分析如下:

(1).拖動文字無需通過dragstart事件處理函式設定資料,從作業系統拖動檔案也是如此。

(2).可以看到有兩種型別,這是因為從網頁拖動文字,不但純文字被拖動了,裡面還夾雜了一些HTML程式碼。

[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">
#demo {
  margin: 20px;
}
#demo .preview {
  height: 300px;
  width:300px;
  background: #ddd;
}
#demo li {
  list-style:none;
}
#demo img {
  max-height: 150px;
  width: auto;
}
</style>
<script>
window.onload = () => {
  let preview = document.querySelector('.preview');
 
  preview.addEventListener('dragover', function (e) {
    e.preventDefault();
  }, false);
 
  preview.addEventListener('drop', function (e) {
    e.preventDefault();
    e.stopPropagation();

    console.log(e.dataTransfer.types);
    
    [].forEach.call(e.dataTransfer.files, function (file) {
      if (file && file.type.match('image.*')) {
        let reader = new FileReader();
        reader.onload = function (e) {
          var img = document.createElement('img');
          img.src = e.target.result;
          var li = document.createElement('li');
          li.appendChild(img);
          preview.appendChild(li);
        };
        reader.readAsDataURL(file);
      }
    });
  }, false);
}
</script>
</head>
<body>
  <div id="demo">
    <h3>拖拽圖片進入下面區域預覽</h3>
    <ul class="preview"></ul>
  </div>
</body>
</html>

從作業系統向瀏覽器拖動一個圖片進來,控制檯列印結果如下:

a:3:{s:3:\"pic\";s:43:\"portal/201910/09/233933wepkoso55zmkleh5.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

控制檯列印效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201910/09/233946fvgytyr84vdytxyz.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

如果是從作業系統同拖拽的檔案,那麼獲取的陣列元素是"Files"。

前面已經說過,無需在dragstart事件處理函式設定資料,系統自動完成。