Start · Sprachen · JavaScript · Referenz · InputEvent.dataTransfer

InputEvent.dataTransfer

Eigenschaft

Gibt ein <code>DataTransfer</code>-Objekt mit den Rich- oder Klartextdaten zurück, die in bearbeitbaren Inhalt eingefügt oder dort ersetzt werden. Sonst gibt sie <code>null</code> zurück.

seit JavaScript Baseline: alle modernen Browser (Chrome 60+, Safar Kategorie: webapi

Signatur

get InputEvent.prototype.dataTransfer

Beschreibung

Die schreibgeschützte Eigenschaft dataTransfer eines InputEvent liefert die Daten, die eine Eingabe gerade in ein contenteditable-Element einfügt. Das passiert etwa beim Einfügen aus der Zwischenablage, beim Ablegen per Drag-and-drop oder wenn die Rechtschreibprüfung ein Wort ersetzt. Die Daten stehen als DataTransfer-Objekt bereit. Über getData() lesen Sie die Formate text/plain oder text/html aus.

Einen Wert ungleich null gibt es nur, wenn das Ziel ein contenteditable-Element ist und inputType einen dieser Werte hat:

  • insertFromPaste
  • insertFromPasteAsQuotation
  • insertFromDrop
  • insertTransliteration
  • insertReplacementText
  • insertFromYank

In allen anderen Fällen ist der Wert null. Das gilt auch für <input> und <textarea>: Dort steht der Text in InputEvent.data.

Am nützlichsten ist die Eigenschaft im Ereignis beforeinput. Dort können Sie die eingehenden Daten prüfen, bereinigen oder mit preventDefault() ganz abweisen, bevor sich das DOM ändert. So lässt sich zum Beispiel HTML beim Einfügen in reinen Text umwandeln. Im Ereignis input hat die Änderung schon stattgefunden. Dort eignet sich die Eigenschaft nur noch für Auswertungen.

Rückgabewert

Typ
DataTransfer | null
Beschreibung
Ein schreibgeschütztes DataTransfer-Objekt mit den eingefügten Daten, z. B. in den Formaten text/plain und text/html. Wenn der Eingabetyp keine übertragenen Daten hat oder das Ziel kein contenteditable-Element ist, lautet der Wert null.

Beispiele

Eingefügte Daten protokollieren

const editor = document.querySelector('#editor'); // <div id="editor" contenteditable>

editor.addEventListener('beforeinput', (event) => {
  if (event.inputType !== 'insertFromPaste') return;

  const dt = event.dataTransfer;
  if (!dt) return;

  console.log('Formate:', dt.types);
  console.log('Text:', dt.getData('text/plain'));
  console.log('HTML:', dt.getData('text/html'));
});
Formate: ['text/plain', 'text/html'] Text: Hallo Welt HTML: <meta charset="utf-8"><b>Hallo</b> Welt

Beim Einfügen und Ablegen nur reinen Text zulassen

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

const insertPlainText = (event) => {
  const types = ['insertFromPaste', 'insertFromDrop'];
  if (!types.includes(event.inputType) || !event.dataTransfer) return;

  event.preventDefault(); // Standard-Einfügen (mit HTML) verhindern
  const text = event.dataTransfer.getData('text/plain');

  // Zielbereich bestimmen: bevorzugt getTargetRanges(), sonst aktuelle Auswahl
  const selection = window.getSelection();
  const [target] = event.getTargetRanges();
  const range = document.createRange();
  if (target) {
    range.setStart(target.startContainer, target.startOffset);
    range.setEnd(target.endContainer, target.endOffset);
  } else if (selection.rangeCount) {
    range.setStart(selection.getRangeAt(0).startContainer, selection.getRangeAt(0).startOffset);
    range.setEnd(selection.getRangeAt(0).endContainer, selection.getRangeAt(0).endOffset);
  } else {
    return;
  }

  range.deleteContents();
  const node = document.createTextNode(text);
  range.insertNode(node);

  // Cursor hinter den eingefügten Text setzen
  range.setStartAfter(node);
  range.collapse(true);
  selection.removeAllRanges();
  selection.addRange(range);
};

editor.addEventListener('beforeinput', insertPlainText);

// Später wieder entfernen, z. B. beim Wechsel in einen Rich-Text-Modus
// editor.removeEventListener('beforeinput', insertPlainText);

Unterschied zwischen textarea und contenteditable

const textarea = document.querySelector('textarea');
const editable = document.querySelector('[contenteditable]');

const report = (event) => {
  console.log(
    event.target.tagName,
    event.inputType,
    'dataTransfer:', event.dataTransfer ? 'vorhanden' : null,
    'data:', event.data
  );
};

textarea.addEventListener('input', report);
editable.addEventListener('input', report);

// Nach dem Einfügen von „Hallo“ in beide Felder:
TEXTAREA insertFromPaste dataTransfer: null data: Hallo DIV insertFromPaste dataTransfer: vorhanden data: null