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

浏览器兼容性

另见