DataTransferItem.getAsFile()

admin發表於2019-10-13

拖拽操作可以通過DataTransfer物件從源元素向目標元素傳遞資料。

DataTransferItemList 集合包含所有傳遞的資料項列表。

集合中的每一項就是一個DataTransferItem型別物件,表示一條傳遞的資料。

關於DataTransferItem物件更多內容參閱DataTransferItem 物件一章節。

如果當前DataTransferItem物件kind屬性值為"file",則返回此file物件,否則返回null。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
let File = DataTransferItem.getAsFile()

下面通過程式碼例項演示一下此方法。

[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/plain",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));

    // 測試效果
    let itemList = ev.dataTransfer.items;
    console.log(itemList[0].getAsFile());
  }
}
</script>
</head>
<body>
  <p draggable="true" id="p"></p>
  <div id="box"></div>
</body>
</html>

將紅色P元素拖動到底部DIV元素中,谷歌瀏覽器控制檯列印效果如下:

a:3:{s:3:\"pic\";s:43:\"portal/201910/13/014010gwvihhgzz2iv7qwi.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

(1).DataTransfer物件傳遞的資料是通過setData()方法設定的P元素id屬性值。

(2).id屬性值自然不是file型別,方法的返回值是null。

[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();
    let itemList = e.dataTransfer.items
    for(let index = 0;index < itemList.length; index++){
      console.log(itemList[index].getAsFile());
    }

    [].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/13/014040p1t32xk273vv29gv.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

檢視谷歌瀏覽器控制檯列印效果如下:

a:3:{s:3:\"pic\";s:43:\"portal/201910/13/014051uuup8gepootgt19t.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到getAsFile()方法返回對應的file物件,上述截圖僅顯示部分資訊。