navigator.clipboard – Zwischenablage lesen und schreiben

navigator.clipboard kommuniziert mit der Zwischenablage (Clipboard) des Betriebssystems – sowohl zum Lesen als auch zum Schreiben von Text und anderer Daten. Der Sicherheit zuliebe funktioniert navigator.clipboard nur über HTTPS (oder localhost) und muss durch eine Benutzereingabe ausgelöst werden (z. B. click)

select () Text für Clipboard selektieren

Text in die Zwischenablage kopieren

Holla die Waldfee!
<div class="someText" contenteditable="true">Holla die Waldfee!</div>
<button id="copyBtn">Ins Clipboard kopieren</button>
const copyBtn = document.getElementById('copyBtn');
copyBtn.addEventListener('click', () => {
	navigator.clipboard.writeText(
		document.querySelector(".someText").textContent)
    .then(() => alert("Text wurde kopiert!"))
    .catch(err => alert("Fehler: " + err));
});

Text, HTML, Bilder, Dateien in die Zwischenablage kopieren

navigator.clipboard.write() kopiert sowohl Text als auch HTML in die Zwischenablage.

Fett und kursiv und rot

HTML aus einem contenteditable-Element kann nicht einfach mit navigator.clipboard.writeText() kopieren werden, da dabei nur reiner Text übernommen wird. Um das HTML inklusive Formatierung zu kopieren, muss navigator.clipboard.write() mit einem ClipboardItem und dem MIME-Type "text/html" verwendet werden.

document.getElementById('copy').addEventListener('click', async () => {
	const editable = document.getElementById('editable');
	const html = editable.innerHTML;
	const blob = new Blob([html], { type: 'text/html' });
	const item = new ClipboardItem({ 'text/html': blob });

	try {
		await navigator.clipboard.write([item]);
		const copied = await blob.text();
		blob.text().then(rawHtml => {
			document.querySelector("#result pre").textContent = rawHtml;
		});
		document.querySelector("#htmlcopied").innerHTML = "text/html kopiert"
	} catch (err) {
		console.error('Fehler beim Kopieren:', err);
	}
});

Um den Inhalt als Quelltext sichtbar zu machen, verwendet das Skript hier rawHtml. Die Alternative wäre, wie bei der Ausgabe von Code vorzugehen und die Sonderzeichen > und < zu escapen.

Werden die kopierten Daten der Zwischenablage in einen Code-Editor eingefügt, erscheint nur der blanke Text ohne jegliche HTML-Tags. Wird die Zwischenablage in ein Textbearbeitungsprogramm wie Word oder Pages eingefügt, werden die Formatierungen übernommen.

clipboard
Formatierter Text in Mac OS Pages (Apple Textbearbeitungsprogramm)
[Log] item – ClipboardItem {types: ["text/html"], presentationStyle: "unspecified", getType: function}
Funktion Beschreibung
writeText(text) Schreibt Text in die Zwischenablage
readText() Liest Text aus der Zwischenablage (Benutzer muss Interaktion geben!)
write(data) Schreibt beliebige Datenformate (z. B. Bilder, HTML)
read() Liest strukturierte Clipboard-Daten (z. B. HTML, Bilder)

Am Rande: Ganz früher gab es auch noch execCommand – das ist aber heute deprecated, veraltet.

Einen Bereich – range – ins Clipboard kopieren

document.createRange() ist ein zentraler Baustein im DOM-API für das Arbeiten mit Textauswahl und DOM-Bereichen. und erzeugt ein Range-Objekt zwischen zwei Positionen im Dokument – ähnlich wie eine markierte Auswahl.

const range = document.createRange();
  • einen Text programmatisch markieren
  • Elemente markieren und verschieben
  • Teile des DOM extrahieren
Methode Beschreibung
range.selectNode(node) Markiert das komplette Element node inkl. Start- und End-Tag
range.selectNodeContents(node) Markiert nur den Inhalt des Elements node (ohne das <div> selbst)
range.setStart(node, offset) Definiert den Startpunkt im DOM (Text-Node oder Element)
range.setEnd(node, offset) Definiert das Ende
range.deleteContents() Löscht alles im Range
range.cloneContents() Gibt eine Kopie des DOM-Inhalts zurück

"window.getSelection()

Einen Text aus mehreren HTML-Blöcken sichtbar markieren, z.B. und den Inhalt über das Clipboard zu kopieren.

const btn = document.getElementById("mark");
btn.addEventListener("click", () => {
	const node = document.getElementById("mytext");
  
	const range = document.createRange();
	range.selectNodeContents(node);
  
	const selection = window.getSelection();
	selection.removeAllRanges();
	selection.addRange(range);
});
Suchen auf mediaevent.de