Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Clipboard: Methode write()

Baseline 2024
Neu verfügbar

Seit Juni 2024 funktioniert diese Funktion auf aktuellen Geräten und in aktuellen Browserversionen. Auf älteren Geräten oder in älteren Browsern funktioniert sie möglicherweise nicht.

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Die Methode write() der Clipboard-Schnittstelle schreibt Daten wie Bilder, Text und benutzerdefinierte Typen in die Zwischenablage des Systems.

Die Methode erwartet ein Array von ClipboardItem-Instanzen als Argument und gibt ein Promise zurück, das erfüllt wird, sobald die Daten geschrieben wurden. Jedes ClipboardItem kann eine oder mehrere Darstellungen eines kopierten Objekts enthalten. Dadurch können Anwendungen, die die Daten lesen, ihr bevorzugtes Format auswählen. Das ist flexibler als writeText(), das nur Text schreiben kann.

Syntax

js
write(data)

Parameter

data

Ein Array von ClipboardItem-Objekten mit den Daten, die in die Zwischenablage geschrieben werden sollen.

Rückgabewert

Ein Promise, das erfüllt wird, sobald die Daten in die Zwischenablage geschrieben wurden. Beachten Sie: Wenn das zugrunde liegende Betriebssystem nicht mehrere native Elemente in der Zwischenablage unterstützt, wird nur das erste ClipboardItem des Arrays geschrieben.

Das Promise wird abgelehnt, wenn die Daten nicht in die Zwischenablage geschrieben werden können.

Ausnahmen

NotAllowedError DOMException

Wird ausgelöst, wenn das Schreiben in die Zwischenablage nicht erlaubt ist.

Beschreibung

Jedes Element im data-Array ist ein ClipboardItem, das eine oder mehrere Darstellungen der zu schreibenden Daten enthalten kann. Als Schlüssel dient jeweils ein MIME-Typ. Durch mehrere Darstellungen kann eine Anwendung, die die Daten später einfügt, das am besten geeignete Format auswählen, das sie verarbeiten kann.

Browser unterstützen üblicherweise das Schreiben von Text, HTML und PNG-Bilddaten. Möglicherweise unterstützen sie auch benutzerdefinierte Webformate (siehe den Abschnitt Browser-Kompatibilität von ClipboardItem).

Sicherheitsaspekte

Das Schreiben in die Zwischenablage ist nur in einem sicheren Kontext möglich.

Weitere Sicherheitsanforderungen werden im Abschnitt Sicherheitsaspekte der API-Übersicht behandelt.

Beispiele

Text in die Zwischenablage schreiben

Diese Beispielfunktion ersetzt beim Drücken einer Schaltfläche den aktuellen Inhalt der Zwischenablage durch eine angegebene Zeichenfolge. Beachten Sie, dass Sie in diesem Fall ebenso gut Clipboard.writeText() verwenden könnten.

js
button.addEventListener("click", () => setClipboard("<empty clipboard>"));

async function setClipboard(text) {
  const type = "text/plain";
  const clipboardItemData = {
    [type]: text,
  };
  const clipboardItem = new ClipboardItem(clipboardItemData);
  await navigator.clipboard.write([clipboardItem]);
}

Die Funktion setClipboard() legt in der Konstante type den MIME-Typ "text/plain" fest. Anschließend definiert sie ein clipboardItemData-Objekt mit einer einzigen Eigenschaft: Deren Schlüssel ist der MIME-Typ und ihr Wert der übergebene Text, der in die Zwischenablage geschrieben werden soll. Danach erstellen wir ein neues ClipboardItem-Objekt und übergeben ihm das clipboardItemData-Objekt.

Abschließend wird write() mit await aufgerufen, um die Daten in die Zwischenablage zu schreiben.

Canvas-Inhalt in die Zwischenablage schreiben

Dieses Beispiel zeichnet ein blaues Rechteck auf ein Canvas. Sie können auf das Rechteck klicken, um den Inhalt des Canvas als Bild in die Zwischenablage zu kopieren. Wählen Sie anschließend ein anderes Element aus und fügen Sie den Inhalt aus der Zwischenablage ein.

HTML

Das HTML definiert lediglich unser <canvas>-Element und das <div>-Element mit der id target, in das das Canvas-Bild eingefügt wird.

html
<canvas id="canvas" width="100" height="100"></canvas>

<div id="target">Paste here.</div>
js
const logElement = document.querySelector("#log");
function log(text) {
  logElement.innerText = `${logElement.innerText}${text}\n`;
  logElement.scrollTop = logElement.scrollHeight;
}

JavaScript

Zunächst definieren wir eine async-Funktion, um ein Canvas in einen Blob umzuwandeln. Sie kapselt die ältere, Callback-basierte Methode HTMLCanvasElement.toBlob() in eine leichter verständliche Funktion auf Basis eines Promise.

js
// Async/await method replacing toBlob() callback
async function getBlobFromCanvas(canvas) {
  return new Promise((resolve, reject) => {
    canvas.toBlob((blob) => {
      if (blob) {
        resolve(blob);
      } else {
        reject(new Error("Canvas toBlob failed"));
      }
    });
  });
}

Als Nächstes richten wir das Canvas ein und fügen einen Event-Listener für das click-Ereignis hinzu.

Wenn Sie auf das blaue Rechteck klicken, wird das Canvas mit dem Rechteck in einen Blob umgewandelt. Anschließend wird der Blob einem ClipboardItem hinzugefügt und in die Zwischenablage geschrieben.

js
const canvas = document.getElementById("canvas");

// Set up canvas
const ctx = canvas.getContext("2d");
ctx.fillStyle = "cornflowerblue";
ctx.fillRect(0, 0, 100, 100);

canvas.addEventListener("click", copyCanvasContentsToClipboard);
const target = document.getElementById("target");

async function copyCanvasContentsToClipboard() {
  // Copy canvas to blob
  try {
    const blob = await getBlobFromCanvas(canvas);
    // Create ClipboardItem with blob and its type, and add to an array
    const data = [new ClipboardItem({ [blob.type]: blob })];
    // Write the data to the clipboard
    await navigator.clipboard.write(data);
    log("Copied");
  } catch (error) {
    log(error);
  }
}

Wenn Sie einen weniger gebräuchlichen Dateityp oder eine Ressource abrufen, deren Typ Sie nicht im Voraus kennen, können Sie mit ClipboardItem.supports() prüfen, ob der Dateityp unterstützt wird. Falls nicht, können Sie eine aussagekräftige Fehlermeldung anzeigen.

Anschließend definieren wir für das Element, in dem der Inhalt der Zwischenablage als Bild angezeigt werden soll, einen Event-Listener für paste-Ereignisse. Mit der FileReader API können wir den Blob mithilfe der Methode readAsDataUrl lesen und ein <img>-Element mit dem Canvas-Inhalt erstellen:

js
target.addEventListener("paste", (event) => {
  const items = (event.clipboardData || window.clipboardData).items;
  const blob = items[0].getAsFile();
  const reader = new FileReader();

  reader.addEventListener("load", (event) => {
    const img = new Image();
    img.src = event.target.result;
    target.appendChild(img);
  });

  reader.readAsDataURL(blob);
});

Ergebnis

Das Ergebnis ist unten zu sehen. Klicken Sie zuerst auf das blaue Quadrat. Wählen Sie dann den Text „Paste here“ aus und verwenden Sie die Tastenkombination Ihres Betriebssystems, um den Inhalt der Zwischenablage einzufügen (beispielsweise Ctrl+V unter Windows).

Ein benutzerdefiniertes Format in die Zwischenablage schreiben

Dieses Beispiel verwendet denselben Code wie Benutzerdefinierte Formate lesen und schreiben in der Übersicht zur Clipboard API, zeigt aber nur den für write() relevanten Code. Weitere Einzelheiten finden Sie in jenem Beispiel.

HTML

JavaScript

Hier definieren wir den benutzerdefinierten Medientyp („MIME-Typ“), den wir im folgenden Code verwenden. Außerdem prüfen wir mit ClipboardItem.supports(), ob dieses Format unterstützt wird, und geben das Ergebnis aus. Das Beispiel funktioniert in beiden Fällen. Wenn das Format nicht unterstützt wird, können wir den benutzerdefinierten Typ lediglich nicht lesen oder schreiben.

js
const customType = "web text/x-mdn-inventory+json";

log(
  ClipboardItem.supports(customType)
    ? `Custom format supported: ${customType}`
    : `Custom format not supported by this browser: ${customType}`,
);

Der folgende Code erstellt das ClipboardItem, wenn die Schaltfläche zum Kopieren gedrückt wird. Er erstellt Darstellungen als text/html- und text/plain-Blobs und fügt den Blob mit dem benutzerdefinierten Format nur hinzu, wenn ClipboardItem.supports() bestätigt, dass der Browser das Format unterstützt. Der Blob für das benutzerdefinierte Format unterscheidet sich nicht grundsätzlich von den anderen Blobs: Der einzige Unterschied ist das Präfix web in seinem Schlüssel. Der text/html-Blob lässt die im benutzerdefinierten Format gespeicherte Spalte SKU aus. Er dient als Ausweichformat, wenn der Inhalt in Anwendungen oder Browser eingefügt wird, die das benutzerdefinierte Format nicht unterstützen.

js
const sourceTable = document.querySelector("#source");
const copyButton = document.querySelector("#copy_custom");

async function copyInventory() {
  const reducedTable = buildTable(
    ["Item", "Quantity"],
    inventory.map((row) => [row.item, row.quantity]),
  );
  const html = reducedTable.outerHTML;
  const text = inventory
    .map((row) => `${row.item}\t${row.quantity}`)
    .join("\n");

  const data = {
    "text/html": new Blob([html], { type: "text/html" }),
    "text/plain": new Blob([text], { type: "text/plain" }),
  };
  if (ClipboardItem.supports(customType)) {
    const json = JSON.stringify(inventory);
    data[customType] = new Blob([json], { type: customType });
  }

  try {
    await navigator.clipboard.write([new ClipboardItem(data)]);
    log(`Copied ${Object.keys(data).length} format(s) to the clipboard.`);
  } catch (error) {
    log(`Copy failed: ${error.message}`);
  }
}

copyButton.addEventListener("click", copyInventory);

document.addEventListener("copy", (event) => {
  const selection = document.getSelection();
  if (!sourceTable.contains(selection.anchorNode)) return;
  event.preventDefault();
  copyInventory();
});

Ergebnis

Klicken Sie auf die Schaltfläche „Copy“ oder wählen Sie die Tabelle aus und kopieren Sie sie manuell, um sie als HTML, Klartext und – falls unterstützt – im benutzerdefinierten Format in die Zwischenablage zu schreiben. Klicken Sie auf die drei „Paste“-Schaltflächen, um zu sehen, welche Darstellung jeweils verwendet wird. Eine vollständige Erläuterung finden Sie unter Benutzerdefinierte Formate lesen und schreiben in der Übersicht zur Clipboard API. Klicken Sie auf „Reload“, um das Beispiel zurückzusetzen.

Hinweis: Erteilen Sie die Berechtigung zum Kopieren und Einfügen, wenn Sie dazu aufgefordert werden.

Spezifikationen

Spezifikation
Clipboard API and events
# dom-clipboard-write

Browser-Kompatibilität

Siehe auch