Signatur
Beschreibung
Der Konstruktor new DataTransfer() erzeugt ein leeres DataTransfer-Objekt ohne Daten, Dateien oder Typen. Normalerweise bekommt man ein solches Objekt nur über Events: event.dataTransfer bei Drag-and-Drop-Events oder event.clipboardData bei Zwischenablage-Events. Mit dem Konstruktor lässt es sich auch selbst anlegen.
In der Praxis braucht man ihn vor allem für zwei Dinge:
- Dateilisten erstellen:
FileListhat keinen öffentlichen Konstruktor. ÜberdataTransfer.items.add(file)und anschließenddataTransfer.filesbekommt man trotzdem eine echteFileList, die maninput.fileszuweisen kann – etwa um einzelne Dateien aus einer Auswahl zu entfernen oder per Einfügen oder Drop erhaltene Dateien in ein Formularfeld zu übernehmen. - Events synthetisch erzeugen: Beim Testen (z. B. mit Jest/Playwright im Browser) lässt sich ein
DragEventoderClipboardEventmit einem vorbefülltenDataTransferauslösen.
Ein selbst erzeugtes Objekt ist immer im Lese-/Schreibmodus. Man kann also setData(), getData(), clearData() und items.add() uneingeschränkt nutzen. Einen echten Drag-Vorgang des Betriebssystems löst es aber nicht aus, und auf die System-Zwischenablage greift es ebenfalls nicht zu.
Rückgabewert
DataTransfer-Objekt: types und files sind leer, dropEffect ist "none", effectAllowed ist "none".Beispiele
Datei aus einem Datei-Input entfernen
// <input type="file" id="upload" multiple>
const input = document.querySelector('#upload');
const removeFile = (index) => {
const dt = new DataTransfer();
[...input.files].forEach((file, i) => {
if (i !== index) dt.items.add(file);
});
input.files = dt.files; // echte FileList zuweisen
console.log(`Verbleibende Dateien: ${input.files.length}`);
};
// z. B. nach Auswahl von 3 Dateien:
removeFile(1);
Programmatisch erzeugte Datei einem Formularfeld zuweisen
const input = document.querySelector('input[type="file"]');
const blob = new Blob(['id;name\n1;Anna\n'], { type: 'text/csv' });
const file = new File([blob], 'export.csv', { type: 'text/csv' });
const dt = new DataTransfer();
dt.items.add(file);
input.files = dt.files;
// Framework-Listener informieren
input.dispatchEvent(new Event('change', { bubbles: true }));
console.log(input.files[0].name, input.files[0].size);
Drop-Event im Test simulieren
const dropZone = document.querySelector('#drop-zone');
dropZone.addEventListener('dragover', (e) => e.preventDefault());
dropZone.addEventListener('drop', (e) => {
e.preventDefault();
console.log('Text:', e.dataTransfer.getData('text/plain'));
console.log('Dateien:', e.dataTransfer.files.length);
});
const dt = new DataTransfer();
dt.setData('text/plain', 'Hallo Welt');
dt.items.add(new File(['Inhalt'], 'notiz.txt', { type: 'text/plain' }));
dropZone.dispatchEvent(new DragEvent('drop', {
bubbles: true,
cancelable: true,
dataTransfer: dt
}));
Eingefügte Bilder in ein Datei-Input übernehmen
const input = document.querySelector('#bilder');
document.addEventListener('paste', (e) => {
const images = [...e.clipboardData.files]
.filter((f) => f.type.startsWith('image/'));
if (!images.length) return;
const dt = new DataTransfer();
[...input.files, ...images].forEach((f) => dt.items.add(f));
input.files = dt.files;
console.log(`${images.length} Bild(er) hinzugefügt`);
});
// Wichtig · Fallstricke
- Kompatibilität: Der Konstruktor ist in allen aktuellen Browsern verfügbar. Ältere Safari-Versionen (vor 14.1) und der Internet Explorer unterstützen ihn nicht und werfen einen
TypeError. Bei Bedarf vorher pertypeof DataTransfer === 'function'bzw. mittry/catchprüfen. - Das Zuweisen von
input.fileslöst keinchange- oderinput-Event aus. React, Vue und ähnliche Frameworks bemerken die Änderung nur, wenn man selbst ein Event auslöst. dataTransfer.filesist eine Momentaufnahme. Spätereitems.add()-Aufrufe tauchen erst nach erneutem Lesen vondt.filesauf.- Synthetische Events sind nicht vertrauenswürdig (
isTrusted === false). Sie starten keinen nativen Drag-Vorgang und schreiben nichts in die System-Zwischenablage. Für die Zwischenablage stattdessen dienavigator.clipboard-API verwenden. - In Node.js und in jsdom gibt es
DataTransfernicht oder nur unvollständig. Für Tests ist ein echter Browser (Playwright, Cypress) oder ein Polyfill nötig. - Sicherheit: Dateien, die man selbst erzeugt oder übernimmt, müssen serverseitig genauso geprüft werden wie vom Nutzer ausgewählte. Auf
file.typeund den Dateinamen ist kein Verlass.