Start · Sprachen · JavaScript · Referenz · DataTransfer.addElement()

DataTransfer.addElement()

Methode

Legt ein anderes Element als Quelle einer Drag-and-Drop-Operation fest. Die Events <code>drag</code> und <code>dragend</code> gehen dann an dieses Element statt an das gezogene.

seit JavaScript Nicht standardisiert: nur Firefox (Gecko), in ande Kategorie: webapi

Signatur

DataTransfer.prototype.addElement(element)

Beschreibung

Die Methode addElement() des DataTransfer-Objekts gibt es nur in Firefox und sie gehört nicht zum Standard. Mit ihr legt man fest, welches Element als Quelle einer Drag-Operation gilt. Normalerweise ist das der Knoten, auf dem dragstart ausgelöst wurde. Nach dem Aufruf von addElement() erhält stattdessen das übergebene Element die folgenden Events drag und dragend.

Nützlich ist das, wenn ein kleines Bedienelement das Ziehen startet (etwa ein „Griff“-Symbol), die Logik für Fortschritt und Abschluss aber zu einem übergeordneten Element gehört, zum Beispiel zu einer ganzen Karte oder Listenzeile. Aufrufen darf man die Methode nur im dragstart-Handler, denn nur dort ist das DataTransfer-Objekt beschreibbar.

Für plattformübergreifenden Code sollte man addElement() nicht verwenden. Dasselbe Ziel erreicht man mit Event-Delegation: Die Listener für drag und dragend hängen am Elternelement, weil diese Events ohnehin nach oben weitergereicht werden. Das Vorschaubild beim Ziehen steuert man mit setDragImage().

Parameter

Name Typ Default Beschreibung
$element Pflicht Element Das Element, das ab jetzt als Quelle der Drag-Operation gilt und die Events drag und dragend erhält.

Rückgabewert

Typ
void
Beschreibung
Kein Rückgabewert (undefined).

Beispiele

Griff-Symbol startet das Ziehen, die Karte gilt als Quelle

// HTML: <div class="card"><span class="handle" draggable="true">⠿</span> Aufgabe</div>
const handle = document.querySelector('.handle');
const card = handle.closest('.card');

handle.addEventListener('dragstart', (event) => {
  event.dataTransfer.setData('text/plain', 'aufgabe-42');
  // Nur in Firefox vorhanden: auf Verfügbarkeit prüfen
  if (typeof event.dataTransfer.addElement === 'function') {
    event.dataTransfer.addElement(card);
  }
});

card.addEventListener('dragend', (event) => {
  console.log('dragend auf:', event.currentTarget.className);
});
dragend auf: card

Browserübergreifende Alternative mit Event-Delegation

// Ohne addElement: drag und dragend werden nach oben weitergereicht,
// deshalb reicht ein Listener auf dem Elternelement.
const list = document.querySelector('#aufgaben');

list.addEventListener('dragstart', (event) => {
  const item = event.target.closest('li');
  if (!item) return;
  event.dataTransfer.setData('text/plain', item.dataset.id);
  event.dataTransfer.setDragImage(item, 10, 10); // ganze Zeile als Vorschau
  item.classList.add('wird-gezogen');
});

list.addEventListener('dragend', (event) => {
  event.target.closest('li')?.classList.remove('wird-gezogen');
  console.log('Ziehen beendet');
});
Ziehen beendet

Verfügbarkeit prüfen

document.addEventListener('dragstart', (event) => {
  const supported = 'addElement' in event.dataTransfer;
  console.log(`addElement verfügbar: ${supported}`);
});
addElement verfügbar: false // z. B. in Chrome, Safari und Edge

// Wichtig · Fallstricke

  • Nicht standardisiert: Die Methode kommt weder in der HTML-Spezifikation noch in Chrome, Edge oder Safari vor. In aktuellen Firefox-Versionen steht sie normalen Webseiten unter Umständen gar nicht zur Verfügung, sondern nur privilegiertem Browser-Code. Deshalb vor jedem Aufruf mit typeof dt.addElement === 'function' prüfen.
  • Nur im dragstart-Handler aufrufen. Später ist das DataTransfer-Objekt schreibgeschützt oder geschützt, und ein Aufruf bleibt wirkungslos oder löst einen Fehler aus.
  • addElement() ändert nicht das Vorschaubild beim Ziehen. Dafür ist setDragImage() zuständig.
  • Für Produktionscode Event-Delegation auf einem gemeinsamen Elternelement verwenden. Das funktioniert in allen Browsern (Baseline).