Signatur
Beschreibung
Der Konstruktor new DragEvent() legt ein neues DragEvent an. Diese Schnittstelle erbt von MouseEvent und hat zusätzlich die Eigenschaft dataTransfer, in der die gezogenen Daten stehen. Normalerweise erzeugt der Browser solche Events selbst, wenn jemand etwas mit der Maus zieht (dragstart, dragover, drop usw.). Mit dem Konstruktor kann man sie auch selbst erzeugen.
Das braucht man vor allem für automatisierte Tests von Drag-and-Drop-Oberflächen, zum Beispiel sortierbare Listen, Kanban-Boards oder Upload-Bereiche. Auch wenn ein Nutzer ohne Maus arbeitet, etwa per Tastatur, kann man so dieselben Handler aufrufen. Erst durch element.dispatchEvent(event) wird das Event an ein Element geschickt.
Man kann alle Optionen von MouseEvent mitgeben (clientX, button, shiftKey …) und zusätzlich ein eigenes DataTransfer-Objekt. Selbst erzeugte Events haben immer isTrusted === false. Deshalb lösen sie keine eingebauten Browser-Aktionen aus: Es gibt keinen echten Drag-Vorgang und keinen Zugriff auf Dateien des Systems.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Events, z. B. "dragstart", "drag", "dragenter", "dragover", "dragleave", "drop" oder "dragend". Groß- und Kleinschreibung zählt. |
|
| $options | DragEventInit | {} | Optionales Objekt mit allen Feldern von MouseEventInit (u. a. bubbles, cancelable, composed, clientX, clientY, button, ctrlKey, shiftKey, relatedTarget) und zusätzlich dataTransfer. |
| $options.dataTransfer | DataTransfer | null | null | Das DataTransfer-Objekt, das später über event.dataTransfer abrufbar ist. Ohne diese Angabe ist dataTransfer gleich null. |
| $options.bubbles | boolean | false | Gibt an, ob das Event im DOM nach oben weitergereicht wird. Das ist wichtig bei Event-Delegation. |
| $options.cancelable | boolean | false | Gibt an, ob preventDefault() wirkt. Das braucht man z. B. bei dragover und drop. |
Rückgabewert
DragEvent-Objekt mit isTrusted === false.Beispiele
Einfaches DragEvent erzeugen und auslösen
const box = document.createElement('div');
document.body.append(box);
box.addEventListener('dragstart', (event) => {
console.log(event.type, event instanceof MouseEvent, event.isTrusted);
});
const event = new DragEvent('dragstart', { bubbles: true, cancelable: true });
box.dispatchEvent(event);
Drop mit eigenem DataTransfer simulieren (z. B. im Test)
const dropZone = document.createElement('div');
document.body.append(dropZone);
dropZone.addEventListener('drop', (event) => {
event.preventDefault();
const id = event.dataTransfer.getData('text/plain');
console.log(`Element ${id} wurde abgelegt`);
});
const dt = new DataTransfer();
dt.setData('text/plain', 'task-42');
const dropEvent = new DragEvent('drop', {
bubbles: true,
cancelable: true,
dataTransfer: dt,
clientX: 120,
clientY: 80
});
const notCanceled = dropZone.dispatchEvent(dropEvent);
console.log('Standardaktion ausgeführt:', notCanceled);
Datei-Upload per Drop testen
const uploadZone = document.querySelector('#upload') ?? document.body;
uploadZone.addEventListener('drop', (event) => {
event.preventDefault();
for (const file of event.dataTransfer.files) {
console.log(file.name, file.type, file.size);
}
});
const dt = new DataTransfer();
dt.items.add(new File(['Hallo Welt'], 'notiz.txt', { type: 'text/plain' }));
uploadZone.dispatchEvent(new DragEvent('drop', {
bubbles: true,
cancelable: true,
dataTransfer: dt
}));
Kompletten Drag-Ablauf in einem Test nachbilden
const fireDrag = (target, type, dataTransfer) =>
target.dispatchEvent(new DragEvent(type, {
bubbles: true,
cancelable: true,
dataTransfer
}));
const source = document.createElement('li');
const target = document.createElement('ul');
source.draggable = true;
document.body.append(source, target);
source.addEventListener('dragstart', (e) => e.dataTransfer.setData('text/plain', 'item-1'));
target.addEventListener('dragover', (e) => e.preventDefault());
target.addEventListener('drop', (e) => console.log('Empfangen:', e.dataTransfer.getData('text/plain')));
const dt = new DataTransfer();
fireDrag(source, 'dragstart', dt);
fireDrag(target, 'dragenter', dt);
fireDrag(target, 'dragover', dt);
fireDrag(target, 'drop', dt);
fireDrag(source, 'dragend', dt);
// Wichtig · Fallstricke
- Keine echte Browser-Aktion: Selbst erzeugte Events haben
isTrusted === false. Der Browser startet damit keinen echten Drag-Vorgang, zeigt kein Vorschaubild beim Ziehen und öffnet keine Dateien. - Standardwerte beachten:
bubblesundcancelablesind standardmäßigfalse. Wenn Handler über Event-Delegation arbeiten oderpreventDefault()nutzen, muss man beide ausdrücklich auftruesetzen. - dataTransfer ist sonst null: Ohne die Option
dataTransferführen Handler, dieevent.dataTransfer.getData()aufrufen, zu einemTypeError. - Nur ein Drag-Ablauf: Ein einmal erzeugtes
DataTransfersollte man für alle Events eines Ablaufs wiederverwenden (vondragstartbisdragend), damit gesetzte Daten erhalten bleiben. - Kompatibilität:
new DataTransfer()gibt es in Safari erst ab Version 14.1. Ältere Browser und manche Testumgebungen unterstützen ihn gar nicht, z. B. jsdom: Dort fehlenDragEventundDataTransferoft ganz und müssen nachgerüstet werden (Polyfill), oder man testet in einem echten Browser (Playwright, Puppeteer). - Auf Touch-Geräten löst natives Ziehen je nach Browser keine
DragEvents aus. Für mobile Geräte sollte man zusätzlich Pointer-Events nutzen.