Arbeiten mit der Zwischenablage

Das Arbeiten mit der Zwischenablage in Erweiterungen wechselt von der Web-API-Methode document.execCommand (die veraltet ist) zur Methode navigator.clipboard.

Hinweis: Die API navigator.clipboard ist eine kürzlich hinzugefügte Ergänzung zur Spezifikation und ist möglicherweise nicht in allen Browsern vollständig implementiert. Dieser Artikel beschreibt einige Einschränkungen, dennoch sollten Sie die Kompatibilitätstabellen für jede Methode überprüfen, bevor Sie sie verwenden, um sicherzustellen, dass die API Ihre Anforderungen unterstützt.

Der Unterschied zwischen den beiden APIs besteht darin, dass document.execCommand analog zu den Tastaturaktionen Kopieren, Ausschneiden und Einfügen ist – Datenaustausch zwischen einer Webseite und der Zwischenablage – während navigator.clipboard beliebige Daten in die Zwischenablage schreibt und von dort liest.

navigator.clipboard bieten separate Methoden zum Lesen oder Schreiben:

Jedoch funktionieren navigator.clipboard.readText() und navigator.clipboard.writeText() in allen Browsern, während navigator.clipboard.read() und navigator.clipboard.write() dies nicht tun. Zum Beispiel sind sie in Firefox zum Zeitpunkt des Schreibens nicht vollständig implementiert, so dass:

Schreiben in die Zwischenablage

Dieser Abschnitt beschreibt die Optionen zum Schreiben von Daten in die Zwischenablage.

Verwendung der Clipboard API

Die Clipboard API schreibt beliebige Daten aus Ihrer Erweiterung in die Zwischenablage. Die Verwendung der API erfordert die Berechtigung "clipboardRead" oder "clipboardWrite" in Ihrer manifest.json-Datei. Da die API nur in Sicheren Kontexten verfügbar ist, kann sie nicht von einem Inhaltsskript genutzt werden, das auf http:-Seiten läuft, sondern nur auf https:-Seiten.

Für Skripte auf Webseiten muss die Berechtigung "clipboard-write" über die Web-API navigator.permissions angefordert werden. Sie können diese Berechtigung mit navigator.permissions.query() überprüfen:

js
navigator.permissions.query({ name: "clipboard-write" }).then((result) => {
  if (result.state === "granted" || result.state === "prompt") {
    /* write to the clipboard now */
  }
});

Hinweis: Der Berechtigungsname clipboard-write wird in Firefox nicht unterstützt, sondern nur in Chromium-Browsern.

Diese Funktion nimmt einen String und schreibt ihn in die Zwischenablage:

js
function updateClipboard(newClip) {
  navigator.clipboard.writeText(newClip).then(
    () => {
      /* clipboard successfully set */
    },
    () => {
      /* clipboard write failed */
    },
  );
}

Verwendung von execCommand()

Die Befehle "cut" und "copy" der Methode document.execCommand() werden verwendet, um den Inhalt der Zwischenablage mit dem ausgewählten Material zu ersetzen. Diese Befehle können ohne spezielle Berechtigung in kurzlebigen Ereignishandlern für eine Benutzeraktion verwendet werden (zum Beispiel ein Klick-Handler).

Zum Beispiel, wenn Sie ein Popup haben, das das folgende HTML enthält:

html
<input id="input" type="text" /> <button id="copy">Copy</button>

Um den "copy"-Button den Inhalt des <input>-Elements kopieren zu lassen, können Sie einen Code wie diesen verwenden:

js
function copy() {
  let copyText = document.querySelector("#input");
  copyText.select();
  document.execCommand("copy");
}

document.querySelector("#copy").addEventListener("click", copy);

Da sich der execCommand()-Aufruf innerhalb eines Klick-Ereignishandlers befindet, benötigen Sie keine speziellen Berechtigungen.

Angenommen, Sie lösen stattdessen das Kopieren von einem Alarm aus:

js
function copy() {
  let copyText = document.querySelector("#input");
  copyText.select();
  document.execCommand("copy");
}

browser.alarms.create({
  delayInMinutes: 0.1,
});

browser.alarms.onAlarm.addListener(copy);

Je nach Browser könnte dies nicht funktionieren. In Firefox wird es nicht funktionieren, und Sie sehen eine Nachricht wie diese in Ihrer Konsole:

document.execCommand('cut'/'copy') wurde abgelehnt, weil es nicht von innerhalb eines kurz laufenden, benutzergenerierten Ereignishandlers aufgerufen wurde.

Um diesen Anwendungsfall zu ermöglichen, müssen Sie die Berechtigung "clipboardWrite" anfordern. Also: "clipboardWrite" ermöglicht es Ihnen, außerhalb eines kurzlebigen Ereignishandlers für eine Benutzeraktion in die Zwischenablage zu schreiben.

Hinweis: document.execCommand() funktioniert nicht bei Eingabefeldern des Typs type="hidden", mit dem HTML5-Attribut "hidden" oder einer entsprechenden CSS-Regel mit "display: none;". Um eine Schaltfläche "In die Zwischenablage kopieren" zu einem span, div oder p-Tag hinzuzufügen, müssen Sie einen Workaround verwenden, wie das Setzen der Position des Eingabefelds auf absolut und das Verschieben aus dem sichtbaren Bereich.

Browser-spezifische Überlegungen

Die Zwischenablage und andere hier beteiligte APIs entwickeln sich schnell, daher gibt es Unterschiede zwischen Browsern, wie sie funktionieren.

In Chrome:

  • Sie benötigen kein "clipboardWrite", selbst um außerhalb eines benutzergenerierten Ereignishandlers auf die Zwischenablage zu schreiben.

In Firefox:

Weitere Informationen finden Sie in den Browser-Kompatibilitätstabellen.

Lesen von der Zwischenablage

Dieser Abschnitt beschreibt die Optionen zum Lesen oder Einfügen von Daten aus der Zwischenablage.

Verwendung der Clipboard API

Die Methoden navigator.clipboard.readText() und navigator.clipboard.read() der Clipboard-API ermöglichen es Ihnen, beliebigen Text oder Binärdaten von der Zwischenablage in sicheren Kontexten zu lesen. Dadurch können Sie auf die Daten in der Zwischenablage zugreifen, ohne sie in ein bearbeitbares Element einfügen zu müssen.

Sobald Sie die Berechtigung "clipboard-read" von der Permissions API erhalten haben, können Sie leicht von der Zwischenablage lesen. Zum Beispiel holt dieses Code-Snippet den Text von der Zwischenablage und ersetzt den Inhalt des Elements mit der ID "outbox" durch diesen Text.

js
navigator.clipboard
  .readText()
  .then((clipText) => (document.getElementById("outbox").innerText = clipText));

Verwendung von execCommand()

Um document.execCommand(&#34;paste&#34;) zu verwenden, benötigt Ihre Erweiterung die Berechtigung "clipboardRead". Dies gilt auch, wenn Sie den Befehl "paste" in einem benutzergenerierten Ereignishandler verwenden, wie click oder keypress.

Betrachten Sie HTML, das etwas wie dies enthält:

html
<textarea id="output"></textarea> <button id="paste">Paste</button>

Um den Inhalt des <textarea>-Elements mit der ID "output" von der Zwischenablage zu setzen, wenn der Benutzer auf den "paste" <button> klickt, können Sie einen Code verwenden wie diesen:

js
function paste() {
  let pasteText = document.querySelector("#output");
  pasteText.focus();
  document.execCommand("paste");
  console.log(pasteText.textContent);
}

document.querySelector("#paste").addEventListener("click", paste);

Browser-spezifische Überlegungen

Firefox unterstützt die Berechtigung "clipboardRead" ab Version 54, erlaubt aber nur das Einfügen in Elemente im Content Editable Mode, was für Inhaltsskripte nur mit einem <textarea> funktioniert. Für Hintergrundskripte kann jedes Element in den Content Editable Mode gesetzt werden.

Browser-Kompatibilität

api.Clipboard

webextensions.api.clipboard

Siehe auch