Start · Sprachen · JavaScript · Referenz · DataTransfer.types

DataTransfer.types

Eigenschaft

Schreibgeschütztes, eingefrorenes Array mit den Formaten (z. B. <code>"text/plain"</code>, <code>"Files"</code>), die bei einem Drag- oder Clipboard-Vorgang verfügbar sind.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

DataTransfer.types

Beschreibung

Die Eigenschaft types des DataTransfer-Objekts liefert ein schreibgeschütztes Array von Zeichenketten. Es enthält die Formate, die mit setData() gesetzt wurden oder die die Quelle eines Drag-&-Drop- bzw. Zwischenablage-Vorgangs bereitstellt. Typische Werte sind MIME-Typen wie "text/plain", "text/html" und "text/uri-list". Werden Dateien gezogen, steht zusätzlich der besondere Eintrag "Files" im Array.

Gebraucht wird types vor allem in den Handlern von dragenter und dragover. Dort liefert getData() aus Sicherheitsgründen (geschützter Modus) noch leere Zeichenketten. types ist dagegen schon lesbar. Damit kannst du früh entscheiden, ob eine Drop-Zone den gezogenen Inhalt annimmt, und nur dann event.preventDefault() aufrufen.

Die Reihenfolge der Einträge entspricht der Reihenfolge, in der die Daten hinzugefügt wurden. Früher gab die Eigenschaft eine DOMStringList zurück. In aktuellen Browsern ist es ein eingefrorenes Array. Zum Prüfen nimmst du also includes() statt contains().

Rückgabewert

Typ
ReadonlyArray<string>
Beschreibung
Eingefrorenes Array der verfügbaren Formate in der Reihenfolge, in der sie hinzugefügt wurden. Werden Dateien gezogen, enthält es "Files". Gibt es keine Daten, ist es leer.

Beispiele

Drop-Zone nur für Dateien freigeben

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

const istDatei = (event) => event.dataTransfer.types.includes('Files');

zone.addEventListener('dragover', (event) => {
  if (!istDatei(event)) return; // Drop nicht erlaubt
  event.preventDefault();       // Drop erlauben
  event.dataTransfer.dropEffect = 'copy';
  zone.classList.add('aktiv');
});

zone.addEventListener('dragleave', () => zone.classList.remove('aktiv'));

zone.addEventListener('drop', (event) => {
  event.preventDefault();
  zone.classList.remove('aktiv');
  const dateien = [...event.dataTransfer.files];
  console.log(dateien.map((f) => f.name));
});
["bericht.pdf", "foto.jpg"]

Gesetzte Typen beim Drag-Start anzeigen

const karte = document.querySelector('#karte');
karte.draggable = true;

karte.addEventListener('dragstart', (event) => {
  const dt = event.dataTransfer;
  dt.setData('text/plain', 'Karte 42');
  dt.setData('application/x-karte-id', '42');
  console.log(dt.types);
});
["text/plain", "application/x-karte-id"]

Bestes Format beim Einfügen wählen

document.addEventListener('paste', (event) => {
  const { types } = event.clipboardData;
  if (types.includes('text/html')) {
    console.log('HTML:', event.clipboardData.getData('text/html'));
  } else if (types.includes('text/plain')) {
    console.log('Text:', event.clipboardData.getData('text/plain'));
  }
  event.preventDefault();
});
Text: Hallo Welt

Eigenen Typ schon in dragenter erkennen

const ablage = document.querySelector('#ablage');

ablage.addEventListener('dragenter', (event) => {
  // getData() liefert hier noch '', types ist aber bereits lesbar
  if (event.dataTransfer.types.includes('application/x-karte-id')) {
    event.preventDefault();
    ablage.classList.add('bereit');
  }
});

// Wichtig · Fallstricke

  • Kein contains() mehr: Ältere Browser (z. B. Firefox vor Version 52 und der alte Edge) gaben eine DOMStringList zurück. Wenn du alte Browser unterstützen musst: Array.from(dt.types).includes(...) funktioniert mit beiden Varianten.
  • Groß- und Kleinschreibung: Mit setData() gesetzte Typen werden in Kleinbuchstaben umgewandelt. Prüfe also auf "application/x-karte-id" und nicht auf eine gemischte Schreibweise.
  • Geschützter Modus: In dragenter und dragover sind nur die Typen lesbar, nicht die Daten selbst. Deshalb eignet sich types hier gut für die Vorprüfung.
  • Eigene Typen über Fenster hinweg: Wird zwischen Fenstern oder Anwendungen gezogen, kommen nicht jeder eigene MIME-Typ und nicht jede Groß-/Kleinschreibung zuverlässig an. Beim Ziehen aus dem Betriebssystem gibt es je nach Browser unterschiedliche Zusatztypen.
  • Sicherheit: Werte, die du über getData('text/html') liest, stammen von außen. Füge sie nie ungefiltert per innerHTML ein, sonst droht XSS. Bereinige sie vorher, z. B. mit DOMPurify.
  • Das Array ist eingefroren. Versuche, es zu verändern, wirken nicht und lösen im Strict Mode einen Fehler aus.