4346 Stimmen

Wie kann ich in JavaScript in die Zwischenablage kopieren?

Wie kopiere ich am besten Text in die Zwischenablage (Multibrowser)?

Ich habe es versucht:

function copyToClipboard(text) {
    if (window.clipboardData) { // Internet Explorer
        window.clipboardData.setData("Text", text);
    } else {
        unsafeWindow.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
        const clipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
        clipboardHelper.copyString(text);
    }
}

Im Internet Explorer kommt es jedoch zu einem Syntaxfehler. In Firefox heißt es unsafeWindow ist nicht definiert .

Ein netter Trick ohne Verwendung von Blitzlicht : Wie greift Trello auf die Zwischenablage des Benutzers zu?

0 Stimmen

Nur aus Neugier: Was wollen Sie in die Zwischenablage kopieren, was der Benutzer nicht selbst tun kann?

311 Stimmen

Nichts Besonderes. Sie können es selbst tun, aber ich möchte auch die Möglichkeit bieten, auf eine Schaltfläche zu klicken, ohne sich Gedanken über die Auswahl des richtigen Textabschnitts zu machen.

8 Stimmen

Dieser lange Blogeintrag enthält eine Vielzahl von Möglichkeiten, dies zu tun: Zugriff auf die System-Zwischenablage mit JavaScript - ein Heiliger Gral?

3490voto

Dean Taylor Punkte 36498

Übersicht

Es gibt drei primäre Browser-APIs für das Kopieren in die Zwischenablage:

  1. Asynchrone Zwischenablage-API [navigator.clipboard.writeText]

    • Textorientierter Teil verfügbar in Chrome 66 (März 2018)
    • Der Zugriff erfolgt asynchron und verwendet JavaScript-Versprechen kann so geschrieben werden, dass Sicherheitsabfragen (falls angezeigt) das JavaScript auf der Seite nicht unterbrechen.
    • Text kann direkt aus einer Variablen in die Zwischenablage kopiert werden.
    • Wird nur auf Seiten unterstützt, die über HTTPS bereitgestellt werden.
    • In Chrome 66 können inaktive Tabs ohne eine Berechtigungsabfrage in die Zwischenablage schreiben.
  2. document.execCommand('copy') ( _Abgelehnt_ )

    • Die meisten Browser unterstützen dies seit ca. April 2015 (siehe Browser-Support unten).
    • Der Zugriff erfolgt synchron, d. h. JavaScript wird auf der Seite angehalten, bis die Seite vollständig ist, einschließlich der Anzeige und der Interaktion des Benutzers mit etwaigen Sicherheitsabfragen.
    • Der Text wird aus dem DOM gelesen und in der Zwischenablage abgelegt.
    • Bei den Tests im April 2015 wurde nur beim Internet Explorer festgestellt, dass beim Schreiben in die Zwischenablage Berechtigungsaufforderungen angezeigt wurden.
  3. Überschreiben des Kopierereignisses

    • Siehe Dokumentation der Zwischenablage-API auf Überschreiben des Kopierereignisses .
    • Ermöglicht es Ihnen, den Inhalt der Zwischenablage bei jedem Kopiervorgang zu ändern und kann auch andere Datenformate als reinen Text enthalten.
    • Wird hier nicht behandelt, da es keine direkte Antwort auf die Frage gibt.

Allgemeine Entwicklungshinweise

Erwarten Sie nicht, dass Befehle für die Zwischenablage funktionieren, während Sie Code in der Konsole testen. Im Allgemeinen muss die Seite aktiv sein (Async Clipboard API) oder erfordert eine Benutzerinteraktion (z. B. einen Benutzerklick), damit sie funktioniert ( document.execCommand('copy') ), um auf die Zwischenablage zuzugreifen, siehe unten für weitere Informationen.

WICHTIG (notiert hier 2020/02/20)

Beachten Sie, dass seit der Erstellung dieses Beitrags Ablehnung von Berechtigungen in herkunftsübergreifenden IFRAMEs und andere IFRAME "Sandboxing" verhindert, dass die eingebetteten Demos "Run code snippet"-Buttons und "codepen.io example" in einigen Browsern (einschließlich Chrome und Microsoft Edge) funktionieren.

Um zu entwickeln, erstellen Sie Ihre eigene Webseite und stellen Sie diese Seite über eine HTTPS-Verbindung bereit, um sie zu testen und zu entwickeln.

Hier ist eine Test-/Demoseite, die zeigt, dass der Code funktioniert: https://deanmarktaylor.github.io/clipboard-test/

Async + Fallback

Aufgrund des Grades der Browserunterstützung für die neue Async-Zwischenablage-API werden Sie wahrscheinlich auf die document.execCommand('copy') Methode, um eine gute Browserabdeckung zu erhalten.

Hier ein einfaches Beispiel (funktioniert möglicherweise nicht in dieser Website eingebettet, lesen Sie den "wichtigen" Hinweis oben):

function fallbackCopyTextToClipboard(text) {
  var textArea = document.createElement("textarea");
  textArea.value = text;

  // Avoid scrolling to bottom
  textArea.style.top = "0";
  textArea.style.left = "0";
  textArea.style.position = "fixed";

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Fallback: Copying text command was ' + msg);
  } catch (err) {
    console.error('Fallback: Oops, unable to copy', err);
  }

  document.body.removeChild(textArea);
}
function copyTextToClipboard(text) {
  if (!navigator.clipboard) {
    fallbackCopyTextToClipboard(text);
    return;
  }
  navigator.clipboard.writeText(text).then(function() {
    console.log('Async: Copying to clipboard was successful!');
  }, function(err) {
    console.error('Async: Could not copy text: ', err);
  });
}

var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');

copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});

copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});

<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:

  </textarea>
</div>

(codepen.io-Beispiel funktioniert möglicherweise nicht, siehe "wichtiger" Hinweis oben) Beachten Sie, dass dieses Snippet in der eingebetteten Vorschau von Stack Overflow nicht gut funktioniert. Sie können es hier versuchen: https://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors=1011

Asynchrone Zwischenablage-API

Beachten Sie, dass es in Chrome 66 die Möglichkeit gibt, über die Berechtigungs-API eine "Berechtigung anzufordern" und den Zugriff auf die Zwischenablage zu testen.

var text = "Example text to appear on clipboard";
navigator.clipboard.writeText(text).then(function() {
  console.log('Async: Copying to clipboard was successful!');
}, function(err) {
  console.error('Async: Could not copy text: ', err);
});

document.execCommand('copy')

Der Rest dieses Beitrags befasst sich mit den Nuancen und Details der document.execCommand('copy') API.

Browser-Unterstützung

Das JavaScript document.execCommand('copy') Unterstützung ist gewachsen, siehe die Links unten für Browser-Updates: ( _Abgelehnt_ )

Einfaches Beispiel

(funktioniert möglicherweise nicht auf dieser Website, siehe "wichtiger" Hinweis oben)

var copyTextareaBtn = document.querySelector('.js-textareacopybtn');

copyTextareaBtn.addEventListener('click', function(event) {
  var copyTextarea = document.querySelector('.js-copytextarea');
  copyTextarea.focus();
  copyTextarea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }
});

<p>
  <button class="js-textareacopybtn" style="vertical-align:top;">Copy Textarea</button>
  <textarea class="js-copytextarea">Hello I'm some text</textarea>
</p>

Komplexes Beispiel: Kopieren in die Zwischenablage ohne Anzeige der Eingabe

Das obige einfache Beispiel funktioniert gut, wenn es eine textarea o input Element auf dem Bildschirm sichtbar.

In einigen Fällen möchten Sie vielleicht Text in die Zwischenablage kopieren, ohne eine input / textarea Element. Dies ist ein Beispiel für eine Möglichkeit, dies zu umgehen (im Grunde ein Element einfügen, in die Zwischenablage kopieren, Element entfernen):

Getestet mit Google Chrome 44, Firefox 42.0a1 und Internet Explorer 11.0.8600.17814.

(funktioniert möglicherweise nicht in dieser Website eingebettet, lesen Sie den "wichtigen" Hinweis oben)

function copyTextToClipboard(text) {
  var textArea = document.createElement("textarea");

  //
  // *** This styling is an extra step which is likely not required. ***
  //
  // Why is it here? To ensure:
  // 1. the element is able to have focus and selection.
  // 2. if the element was to flash render it has minimal visual impact.
  // 3. less flakyness with selection and copying which **might** occur if
  //    the textarea element is not visible.
  //
  // The likelihood is the element won't even render, not even a
  // flash, so some of these are just precautions. However in
  // Internet Explorer the element is visible whilst the popup
  // box asking the user for permission for the web page to
  // copy to the clipboard.
  //

  // Place in the top-left corner of screen regardless of scroll position.
  textArea.style.position = 'fixed';
  textArea.style.top = 0;
  textArea.style.left = 0;

  // Ensure it has a small width and height. Setting to 1px / 1em
  // doesn't work as this gives a negative w/h on some browsers.
  textArea.style.width = '2em';
  textArea.style.height = '2em';

  // We don't need padding, reducing the size if it does flash render.
  textArea.style.padding = 0;

  // Clean up any borders.
  textArea.style.border = 'none';
  textArea.style.outline = 'none';
  textArea.style.boxShadow = 'none';

  // Avoid flash of the white box if rendered for any reason.
  textArea.style.background = 'transparent';

  textArea.value = text;

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }

  document.body.removeChild(textArea);
}

var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');

copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});

copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});

<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:

  </textarea>
</div>

Zusätzliche Hinweise

Funktioniert nur, wenn der Benutzer eine Aktion ausführt

Alle document.execCommand('copy') Aufrufe müssen als direkte Folge einer Benutzeraktion erfolgen, z. B. durch einen Click-Event-Handler. Dies ist eine Maßnahme, um zu verhindern, dass die Zwischenablage des Benutzers manipuliert wird, wenn dieser es nicht erwartet.

Siehe die Google Developers Beitrag hier für weitere Informationen.

Zwischenablage-API

Der vollständige Entwurf der Clipboard-API-Spezifikation kann hier eingesehen werden: https://w3c.github.io/clipboard-apis/

Wird sie unterstützt?

  • document.queryCommandSupported('copy') sollte zurückkehren true wenn der Befehl "vom Browser unterstützt wird".
  • et document.queryCommandEnabled('copy') return true wenn die document.execCommand('copy') wird erfolgreich sein, wenn sie jetzt aufgerufen wird. Überprüfung, ob der Befehl von einem vom Benutzer initiierten Thread aufgerufen wurde und andere Anforderungen erfüllt sind.

Als Beispiel für Browser-Kompatibilitätsprobleme lieferte Google Chrome von ~April bis ~Oktober 2015 nur true von document.queryCommandSupported('copy') wenn der Befehl von einem vom Benutzer initiierten Thread aufgerufen wurde.

Einzelheiten zur Kompatibilität siehe unten.

Browser-Kompatibilität Detail

Während ein einfacher Aufruf von document.execCommand('copy') eingewickelt in ein try / catch Block als Ergebnis eines Benutzers aufgerufen wird, klicken Sie auf die meisten Kompatibilität verwenden Sie die folgenden hat einige Vorbehalte:

Jeder Aufruf von document.execCommand , document.queryCommandSupported o document.queryCommandEnabled sollte in eine Hülle aus try / catch Block.

Verschiedene Browser-Implementierungen und Browser-Versionen lösen unterschiedliche Arten von Ausnahmen aus, wenn sie aufgerufen werden, anstatt dass sie false .

Die verschiedenen Browser-Implementierungen sind noch im Fluss und die Zwischenablage-API ist noch im Entwurfsstadium, denken Sie also daran, Ihre Tests durchzuführen.

43 Stimmen

Entschuldigung, dass ich die Party störe, aber document.execCommand is obsolete . Siehe developer.mozilla.org/de-US/docs/Web/API/Document/execCommand

3 Stimmen

@tnkh sicher, aber der Ersatz (Clipboard-API) ist noch nicht vollständig fertig und wird noch nicht unterstützt.

4 Stimmen

Die Unterstützung der Zwischenablage-API liegt derzeit bei 91 % der weltweiten Nutzer: caniuse.com/mdn-api_clipboard_writetext

1387voto

Jarek Milewski Punkte 14783

Das automatische Kopieren in die Zwischenablage kann gefährlich sein und wird daher von den meisten Browsern (außer Internet Explorer) erschwert. Ich persönlich verwende den folgenden einfachen Trick:

function copyToClipboard(text) {
  window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
}

Dem Benutzer wird das Eingabeaufforderungsfeld angezeigt, in dem der zu kopierende Text bereits ausgewählt ist. Jetzt genügt es, die Taste Ctrl + C y Enter (um die Box zu schließen) - und voila!

Der Kopiervorgang aus der Zwischenablage lautet nun sicher weil der Benutzer es manuell (aber auf ziemlich einfache Weise) macht. Natürlich funktioniert es in allen Browsern.

<button id="demo" onclick="copyToClipboard(document.getElementById('demo').innerHTML)">This is what I want to copy</button>

<script>
  function copyToClipboard(text) {
    window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
  }
</script>

26 Stimmen

Die Anzahl der in diesem Dialogfeld angezeigten Zeichen ist jedoch begrenzt, und somit auch die Menge der zu kopierenden Daten.

107 Stimmen

Clever, aber das unterstützt nur eine Zeile.

66 Stimmen

Es ist trivial, die "Prompt"-Funktion in ein benutzerdefiniertes Modal umzuwandeln. Der Trick besteht darin, ein editierbares Inhaltsfeld zu verwenden und eine Vorauswahl des Textes zu treffen, ohne die Benutzeroberfläche des Browsers zu zerstören, indem der Benutzer gezwungen wird, die Aktion selbst durchzuführen. A++

525voto

Greg Lowe Punkte 13532

Der folgende Ansatz funktioniert in Chrome, Firefox, Internet Explorer und Edge sowie in neueren Versionen von Safari (die Kopierunterstützung wurde in Version 10, die im Oktober 2016 veröffentlicht wurde, hinzugefügt).

  • Erstellen Sie einen Textbereich und legen Sie den Inhalt auf den Text fest, den Sie in die Zwischenablage kopieren möchten.
  • Fügen Sie die Textarea an das DOM an.
  • Markieren Sie den Text in der Textarea.
  • document.execCommand("copy") aufrufen
  • Entfernen Sie die Textarea aus dem Dom.

Hinweis: Sie werden die Textarea nicht sehen, da sie innerhalb desselben synchronen Aufrufs von Javascript-Code hinzugefügt und entfernt wird.

Es gibt einige Dinge, auf die Sie achten sollten, wenn Sie dies selbst umsetzen wollen:

  • Aus Sicherheitsgründen kann dies nur von einem Event-Handler wie z.B. Klick aufgerufen werden (genau wie beim Öffnen von Windows).
  • Der Internet Explorer zeigt beim ersten Aktualisieren der Zwischenablage ein Dialogfeld mit einer Berechtigung an.
  • Internet Explorer und Edge führen einen Bildlauf durch, wenn der Textbereich fokussiert ist.
  • execCommand() kann in einigen Fällen einen Fehler verursachen.
  • Zeilenumbrüche und Tabulatoren können verschluckt werden, es sei denn, Sie verwenden eine Textarea. (Die meisten Artikel scheinen die Verwendung eines div zu empfehlen)
  • Der Textbereich ist sichtbar, während der Internet Explorer-Dialog angezeigt wird. Sie müssen ihn entweder ausblenden oder die Internet Explorer-spezifische clipboardData-API verwenden.
  • Im Internet Explorer können Systemadministratoren die Zwischenablage-API deaktivieren.

Die unten stehende Funktion sollte alle folgenden Probleme so sauber wie möglich lösen. Bitte hinterlassen Sie einen Kommentar, wenn Sie Probleme finden oder Vorschläge zur Verbesserung haben.

// Copies a string to the clipboard. Must be called from within an
// event handler such as click. May return false if it failed, but
// this is not always possible. Browser support for Chrome 43+,
// Firefox 42+, Safari 10+, Edge and Internet Explorer 10+.
// Internet Explorer: The clipboard feature may be disabled by
// an administrator. By default a prompt is shown the first
// time the clipboard is used (per session).
function copyToClipboard(text) {
    if (window.clipboardData && window.clipboardData.setData) {
        // Internet Explorer-specific code path to prevent textarea being shown while dialog is visible.
        return window.clipboardData.setData("Text", text);

    }
    else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
        var textarea = document.createElement("textarea");
        textarea.textContent = text;
        textarea.style.position = "fixed";  // Prevent scrolling to bottom of page in Microsoft Edge.
        document.body.appendChild(textarea);
        textarea.select();
        try {
            return document.execCommand("copy");  // Security exception may be thrown by some browsers.
        }
        catch (ex) {
            console.warn("Copy to clipboard failed.", ex);
            return prompt("Copy to clipboard: Ctrl+C, Enter", text);
        }
        finally {
            document.body.removeChild(textarea);
        }
    }
}

https://jsfiddle.net/fx6a6n6x/

18 Stimmen

Nette Antwort: Browserübergreifende Unterstützung, Fehlerbehandlung und Aufräumen. Seit der heutigen neuen Unterstützung für queryCommandSupported ist das Kopieren in die Zwischenablage nun in Javascript möglich und dies sollte die akzeptierte Antwort sein, anstelle des umständlichen "window.prompt("Copy to clipboard: Ctrl+C, Enter", text)"-Workarounds. window.clipboardData wird in IE9 unterstützt, also sollten Sie IE9 in die Browser-Supportliste aufnehmen und ich denke, vielleicht auch IE8 und früher, aber das muss überprüft werden.

0 Stimmen

Ja. IE 8/9 sollte in Ordnung sein. Unsere App unterstützt sie nicht. Also habe ich es nicht getestet. Der IE wird ab Januar nicht mehr unterstützt, also mache ich mir keine großen Sorgen. Hoffentlich wird Safari bald unterstützt. Ich bin sicher, sie haben es auf dem Radar.

8 Stimmen

@SantiagoCorredoira: Im Jahr 2016 sollte dies die akzeptierte Antwort sein. Bitte erwägen Sie die Neuvergabe des BGT (großes grünes Häkchen).

173voto

nikksan Punkte 3015

Hier ist meine Meinung dazu...

function copy(text) {
    var input = document.createElement('input');
    input.setAttribute('value', text);
    document.body.appendChild(input);
    input.select();
    var result = document.execCommand('copy');
    document.body.removeChild(input);
    return result;
 }

@korayem: Beachten Sie, dass die Verwendung von html input Das Feld beachtet keine Zeilenumbrüche \n und reduziert jeden Text auf eine einzige Zeile.

Wie von @nikksan in den Kommentaren erwähnt, ist die Verwendung von textarea wird das Problem wie folgt behoben:

function copy(text) {
    var input = document.createElement('textarea');
    input.innerHTML = text;
    document.body.appendChild(input);
    input.select();
    var result = document.execCommand('copy');
    document.body.removeChild(input);
    return result;
}

0 Stimmen

@nikksan wie man die Zeichenkette kopiert mit \n ?

4 Stimmen

@sof-03 verwenden Sie textarea anstelle von input und fügen Sie hinzu \r\n für einen Zeilenumbruch

1 Stimmen

Funktioniert nicht in Microsoft Edge 42.17134.1.0 auf Win10x64

101voto

bandi Punkte 4104

Das Lesen und Ändern der Zwischenablage einer Webseite wirft Sicherheits- und Datenschutzbedenken auf. Im Internet Explorer ist dies jedoch möglich. Ich habe Folgendes gefunden Beispielschnipsel :

    <script type="text/javascript">
        function select_all(obj) {
            var text_val=eval(obj);
            text_val.focus();
            text_val.select();
            r = text_val.createTextRange();
            if (!r.execCommand) return; // feature detection
            r.execCommand('copy');
        }
    </script>
    <input value="http://www.sajithmr.com"
     onclick="select_all(this)" name="url" type="text" />

7 Stimmen

Mit Flash für einen einfachen Kopiervorgang scheint wie Overkill, froh, es war eine saubere JS Weg, dies zu tun. Und da wir in einem Unternehmen env sind. IE ist genau richtig. Danke Bandi!

5 Stimmen

Bitte erklären Sie, was execCommand(\\’copy\\’); tut, wenn nicht in die Zwischenablage für IE kopieren? @mrBorna

22 Stimmen

Nicht verwenden if(!document.all) sondern if(!r.execCommand) damit sie nicht von anderen umgesetzt wird! Document.all ist in diesem Zusammenhang absolut nicht relevant.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X