Start · Sprachen · JavaScript · Referenz · DataTransfer.items

DataTransfer.items

Eigenschaft

Schreibgeschützte <code>DataTransferItemList</code> mit allen <code>DataTransferItem</code>-Objekten eines Drag-and-Drop- oder Zwischenablage-Vorgangs.

seit JavaScript Baseline: alle modernen Browser (Chrome 13+, Firef Kategorie: webapi

Signatur

DataTransfer.items

Beschreibung

Die Eigenschaft items des DataTransfer-Objekts liefert eine DataTransferItemList. Sie enthält für jedes übertragene Datenelement ein DataTransferItem, zum Beispiel einen Text, eine URL, HTML oder eine Datei. Jedes Element hat die Eigenschaften kind ("string" oder "file") und type (MIME-Typ).

Gegenüber den älteren Wegen getData() und files ist items vielseitiger. Du kannst Text- und Dateielemente einheitlich durchlaufen, Dateien mit getAsFile() lesen, Strings asynchron mit getAsString() abrufen und mit webkitGetAsEntry() bzw. getAsFileSystemHandle() sogar ganze Ordner verarbeiten. Beim Start eines Drags kannst du mit items.add() eigene Daten anhängen und sie mit remove() oder clear() wieder entfernen.

Die Eigenschaft selbst ist schreibgeschützt: Du kannst ihr keine neue Liste zuweisen, wohl aber die zurückgegebene Liste verändern, sofern der Vorgang das erlaubt. Typische Einsatzorte sind Handler für drop, dragstart, dragover und paste (über ClipboardEvent.clipboardData).

Rückgabewert

Typ
DataTransferItemList
Beschreibung
Eine Liste mit DataTransferItem-Objekten. Sie ist array-ähnlich (length, Indexzugriff) und iterierbar, aber kein echtes Array.

Beispiele

Abgelegte Dateien und Texte in einer Drop-Zone auswerten

const zone = document.querySelector('#dropzone');

zone.addEventListener('dragover', (event) => {
  event.preventDefault(); // nötig, damit ein Drop möglich ist
});

zone.addEventListener('drop', (event) => {
  event.preventDefault();
  for (const item of event.dataTransfer.items) {
    if (item.kind === 'file') {
      const file = item.getAsFile();
      console.log(`Datei: ${file.name} (${file.size} Bytes)`);
    } else if (item.kind === 'string' && item.type === 'text/plain') {
      item.getAsString((text) => console.log(`Text: ${text}`));
    }
  }
});
Datei: foto.jpg (204800 Bytes)

Eigene Daten beim Drag-Start hinzufügen

const card = document.querySelector('#task-card');
card.draggable = true;

card.addEventListener('dragstart', (event) => {
  const { items } = event.dataTransfer;
  items.clear();
  items.add(card.dataset.id, 'text/plain');
  items.add(JSON.stringify({ id: card.dataset.id, title: card.textContent }), 'application/json');
  console.log(`Anzahl Elemente: ${items.length}`);
});
Anzahl Elemente: 2

Bilder aus der Zwischenablage einfügen

document.addEventListener('paste', (event) => {
  const images = [...event.clipboardData.items]
    .filter((item) => item.kind === 'file' && item.type.startsWith('image/'))
    .map((item) => item.getAsFile());

  for (const img of images) {
    const el = document.createElement('img');
    el.src = URL.createObjectURL(img);
    document.body.append(el);
  }
  console.log(`${images.length} Bild(er) eingefügt`);
});
1 Bild(er) eingefügt

Abgelegte Ordner erkennen

zone.addEventListener('drop', (event) => {
  event.preventDefault();
  for (const item of event.dataTransfer.items) {
    const entry = item.webkitGetAsEntry?.();
    if (entry) {
      console.log(`${entry.isDirectory ? 'Ordner' : 'Datei'}: ${entry.name}`);
    }
  }
});
Ordner: Urlaub-2024

// Wichtig · Fallstricke

  • Nur synchron nutzbar: Die Liste ist nur während des Event-Handlers gültig. Nach dem ersten await oder in einem späteren Callback ist sie leer. Hol dir Dateien mit getAsFile() deshalb sofort und verarbeite sie erst danach asynchron.
  • Schutzmodi: In dragenter und dragover ist der Datenspeicher geschützt. Dort siehst du nur kind und type, aber keine Inhalte. Lesbar sind die Daten nur in drop (bzw. paste), schreibbar nur in dragstart.
  • getAsString() arbeitet mit einem Callback und liefert kein Promise.
  • Die Liste ist kein Array. Für filter oder map wandelst du sie zuerst um, z. B. mit [...items] oder Array.from(items).
  • Ohne preventDefault() in dragover und drop öffnet der Browser die Datei selbst, statt deinen Code auszuführen.
  • Kompatibilität: Wird von allen modernen Browsern unterstützt, Safari erst seit 11.1. webkitGetAsEntry() ist nicht standardisiert, funktioniert aber in allen großen Browsern.
  • Sicherheit: Abgelegter HTML-Inhalt (text/html) kann Schadcode enthalten. Füge ihn nie ungeprüft per innerHTML ein, sonst droht XSS.