DataTransfer

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

DataTransfer 物件用於在上下文之間(例如拖放操作或剪貼簿讀寫)傳輸資料。它可以包含一個或多個數據項,每個資料項具有一個或多個數據型別。

DataTransfer 最初是為 HTML 拖放 API 設計的,作為 DragEvent.dataTransfer 屬性,並且仍然在 HTML 拖放部分中進行規範說明。但現在它也被其他 API 使用,例如 ClipboardEvent.clipboardDataInputEvent.dataTransfer。但是,其他 API 只使用其介面的某些部分,忽略 dropEffect 等屬性。DataTransfer 的文件主要討論其在拖放操作中的用法,您應該參考其他 API 的文件以瞭解 DataTransfer 在這些上下文中的用法。

建構函式

DataTransfer()

建立並返回一個新的 DataTransfer 物件。

例項屬性

DataTransfer.dropEffect

獲取當前選定的拖放操作的型別,或將操作設定為新型別。該值必須是 nonecopylinkmove

DataTransfer.effectAllowed

提供所有可能的操作型別。必須是 nonecopycopyLinkcopyMovelinklinkMovemovealluninitialized 之一。

DataTransfer.files 只讀

包含資料傳輸中所有可用本地檔案的列表。如果拖動操作不涉及拖動檔案,則此屬性為空列表。

DataTransfer.items 只讀

提供一個 DataTransferItemList 物件,它是一個所有拖動資料的列表。

DataTransfer.types 只讀

一個字串陣列,給出在 dragstart 事件中設定的格式。

例項方法

DataTransfer.addElement() 實驗性 非標準

設定給定元素的拖動源。這將是觸發 dragdragend 事件的元素,而不是預設目標(被拖動的節點)。Firefox 特有。

DataTransfer.clearData()

刪除與給定型別關聯的資料。型別引數是可選的。如果型別為空或未指定,則刪除與所有型別關聯的資料。如果指定型別的​​資料不存在,或者資料傳輸中沒有資料,則此方法無效。

DataTransfer.getData()

檢索給定型別的資料,如果該型別的資料不存在或資料傳輸中沒有資料,則返回空字串。

DataTransfer.setData()

設定給定型別的資料。如果該型別的資料不存在,則將其新增到末尾,使型別列表中的最後一項成為新格式。如果該型別的資料已存在,則現有資料將在相同位置被替換。

DataTransfer.setDragImage()

如果需要自定義拖動影像,請設定要使用的影像。

示例

本文件中列出的所有方法和屬性都有自己的參考頁面,每個參考頁面要麼直接包含該介面的示例,要麼有指向示例的連結。

在貼上或放置事件中讀取資料

在以下示例中,我們有一個 <form>,其中包含三種不同型別的文字輸入:一個文字 <input> 元素,一個 <textarea> 元素,以及一個 <div> 元素,其 contenteditable 設定為 true。使用者可以將文字貼上或放置到任何這些元素中,並將顯示 ClipboardEvent.clipboardDataDragEvent.dataTransfer 物件中的資料。

HTML

html
<form>
  <fieldset>
    <legend>&lt;input /></legend>
    <input type="text" />
    <table class="center">
      <tr>
        <th scope="row">Operation type</th>
        <td></td>
      </tr>
      <tr>
        <th scope="row">Content type</th>
        <td></td>
      </tr>
    </table>
  </fieldset>
  <fieldset>
    <legend>&lt;textarea /></legend>
    <textarea></textarea>
    <table class="center">
      <tr>
        <th scope="row">Operation type</th>
        <td></td>
      </tr>
      <tr>
        <th scope="row">Content type</th>
        <td></td>
      </tr>
    </table>
  </fieldset>
  <fieldset>
    <legend>&lt;div contenteditable /></legend>
    <div contenteditable></div>
    <table class="center">
      <tr>
        <th scope="row">Operation type</th>
        <td></td>
      </tr>
      <tr>
        <th scope="row">Content type</th>
        <td></td>
      </tr>
    </table>
  </fieldset>
  <p class="center">
    <input type="reset" />
  </p>
</form>

CSS

css
.center {
  text-align: center;
}

form > fieldset > * {
  vertical-align: top;
}
form input,
form textarea,
form [contenteditable] {
  min-width: 15rem;
  padding: 0.25rem;
}
[contenteditable] {
  appearance: textfield;
  display: inline-block;
  min-height: 1rem;
  border: 1px solid;
}

form table {
  display: inline-table;
}
table ol {
  text-align: left;
}

JavaScript

js
const form = document.querySelector("form");

function displayData(event) {
  if (event.type === "drop") event.preventDefault();

  const cells = event.target.nextElementSibling.querySelectorAll("td");
  cells[0].textContent = event.type;
  const transfer = event.clipboardData || event.dataTransfer;
  const ol = document.createElement("ol");
  cells[1].textContent = "";
  cells[1].appendChild(ol);
  for (const item of transfer.items) {
    const li = document.createElement("li");
    li.textContent = `${item.kind} ${item.type}`;
    ol.appendChild(li);
  }
}

form.addEventListener("paste", displayData);
form.addEventListener("drop", displayData);
form.addEventListener("reset", () => {
  for (const cell of form.querySelectorAll("[contenteditable], td")) {
    cell.textContent = "";
  }
});

結果

規範

規範
HTML
# the-datatransfer-interface

瀏覽器相容性

另見