Was ist der beste Weg, um Text in die Zwischenablage zu kopieren? (Multi-Browser)
Ich habe 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);
}
}
In Internet Explorer wird jedoch ein Syntaxfehler ausgegeben. In Firefox heißt es unsafeWindow is not defined
.
Ein schöner Trick ohne Blitz: Wie greift Trello auf die Zwischenablage des Benutzers zu?
javascript
clipboard
copy-paste
Santiago Corredoira
quelle
quelle
Antworten:
Überblick
Es gibt drei primäre Browser-APIs zum Kopieren in die Zwischenablage:
[navigator.clipboard.writeText]
document.execCommand('copy')
Allgemeine Entwicklungshinweise
Erwarten Sie nicht, dass Befehle in der Zwischenablage funktionieren, während Sie Code in der Konsole testen. Im Allgemeinen muss die Seite aktiv sein (Async Clipboard API) oder eine Benutzerinteraktion (z. B. ein Benutzerklick) erfordern, damit (
document.execCommand('copy')
) auf die Zwischenablage zugreifen kann (siehe unten).WICHTIG (hier vermerkt 2020/02/20)
Beachten Sie, dass seit diesem Beitrag wurde ursprünglich geschrieben in Quer Herkunft IFRAMEs deprecation von Berechtigungen und anderen IFRAME „Sandbox“ verhindert , dass die eingebetteten Demos „Run - Code - Snippet“ Tasten und „codepen.io Beispiels“ von der Arbeit in einigen Browsern (einschließlich Chrome und Microsoft Edge ).
Um eine eigene Webseite zu erstellen, stellen Sie diese Seite über eine HTTPS-Verbindung zum Testen und Entwickeln bereit.
Hier ist eine Test- / Demoseite, die die Funktionsweise des Codes demonstriert: https://deanmarktaylor.github.io/clipboard-test/
Async + Fallback
Aufgrund der Browserunterstützung für die neue Async-Zwischenablage-API möchten Sie wahrscheinlich auf die
document.execCommand('copy')
Methode zurückgreifen , um eine gute Browserabdeckung zu erzielen.Hier ist ein einfaches Beispiel (funktioniert möglicherweise nicht eingebettet in diese Site, lesen Sie den "wichtigen" Hinweis oben):
(Das Beispiel codepen.io funktioniert möglicherweise nicht. Lesen Sie den "wichtigen" Hinweis oben.) Beachten Sie, dass dieses Snippet in der eingebetteten Vorschau von Stack Overflow nicht gut funktioniert. Sie können es hier ausprobieren: https://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011
Asynchrone Zwischenablage-API
Beachten Sie, dass Sie über die Berechtigungs-API in Chrome 66 die Berechtigung "anfordern" und den Zugriff auf die Zwischenablage testen können.
document.execCommand ('copy')
Der Rest dieses Beitrags befasst sich mit den Nuancen und Details der
document.execCommand('copy')
API.Browser-Unterstützung
Die JavaScript-
document.execCommand('copy')
Unterstützung wurde erweitert. Browser-Updates finden Sie unter den folgenden Links:Einfaches Beispiel
(funktioniert möglicherweise nicht eingebettet in diese Site, lesen Sie den "wichtigen" Hinweis oben)
Komplexes Beispiel: In die Zwischenablage kopieren, ohne dass Eingaben angezeigt werden
Das obige einfache Beispiel funktioniert hervorragend, wenn auf dem Bildschirm ein
textarea
oderinput
-Element angezeigt wird.In einigen Fällen möchten Sie möglicherweise Text in die Zwischenablage kopieren, ohne ein
input
/textarea
-Element anzuzeigen . Dies ist ein Beispiel für eine Möglichkeit, dies zu umgehen (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 eingebettet in diese Site, lesen Sie den "wichtigen" Hinweis oben)
Zusätzliche Bemerkungen
Funktioniert nur, wenn der Benutzer eine Aktion ausführt
Alle
document.execCommand('copy')
Aufrufe müssen als direktes Ergebnis einer Benutzeraktion erfolgen, z. B. Klickereignishandler. Dies ist eine Maßnahme, um zu verhindern, dass die Zwischenablage des Benutzers durcheinander gebracht wird, wenn er dies nicht erwartet.Weitere Informationen finden Sie im Beitrag der Google-Entwickler hier .
Zwischenablage-API
Beachten Sie, dass die vollständige Entwurfsspezifikation der Zwischenablage-API hier zu finden ist: https://w3c.github.io/clipboard-apis/
Wird es unterstützt?
document.queryCommandSupported('copy')
sollte zurückgeben,true
wenn der Befehl "vom Browser unterstützt wird".document.queryCommandEnabled('copy')
kehren Sie zurück,true
wenn derdocument.execCommand('copy')
Erfolg erfolgreich ist, wenn Sie jetzt aufgerufen werden. Überprüfen, ob der Befehl von einem vom Benutzer initiierten Thread aufgerufen wurde und andere Anforderungen erfüllt sind.Jedoch als Beispiel für Browser Kompatibilitätsprobleme, Google Chrome von ~ April bis ~ Oktober 2015 nur zurück
true
aus ,document.queryCommandSupported('copy')
wenn der Befehl von einem Benutzer initiierten Thread aufgerufen wurde.Beachten Sie die Kompatibilitätsdetails unten.
Details zur Browserkompatibilität
Während ein einfacher Aufruf zum
document.execCommand('copy')
Umschließen in einentry
/catch
-Block, der als Ergebnis eines Benutzerklicks aufgerufen wird, Ihnen die größtmögliche Kompatibilität bietet, hat das Folgende einige Vorbehalte:Jeder Aufruf
document.execCommand
,document.queryCommandSupported
oderdocument.queryCommandEnabled
sollte in einem eingewickelt werdentry
/catch
Block.Unterschiedliche Browser-Implementierungen und Browser-Versionen lösen beim Aufrufen unterschiedliche Arten von Ausnahmen aus, anstatt zurückzukehren
false
.Verschiedene Browser-Implementierungen sind noch im Fluss und die Zwischenablage-API befindet sich noch im Entwurf. Denken Sie also daran, Ihre Tests durchzuführen .
quelle
var str = "word";
?<textarea>
mit JS ausgeblendeten Dummy, hängen Sie ihn andocument.body
, setzen Sie seinen Wert auf die Variable, verwenden Sie ihn in der Geschwindigkeit voncopyTextarea
und entfernen Sie ihn direkt nach dem Kopieren des Inhalts.Das automatische Kopieren in die Zwischenablage kann gefährlich sein, daher machen es die meisten Browser (außer IE) sehr schwierig. Persönlich verwende ich den folgenden einfachen Trick:
Dem Benutzer wird das Eingabeaufforderungsfeld angezeigt, in dem der zu kopierende Text bereits ausgewählt ist. Jetzt reicht es, Ctrl+ Cund Enter(um die Box zu schließen) zu drücken - und voila!
Jetzt ist der Kopiervorgang in der Zwischenablage SICHER, da der Benutzer ihn manuell ausführt (jedoch auf ziemlich einfache Weise). Funktioniert natürlich in allen Browsern.
quelle
Der folgende Ansatz funktioniert in Chrome, Firefox, Internet Explorer und Edge sowie in neueren Versionen von Safari (Kopierunterstützung wurde in Version 10 hinzugefügt, die im Oktober 2016 veröffentlicht wurde).
Hinweis: Der Textbereich wird nicht angezeigt, da er innerhalb desselben synchronen Aufrufs von Javascript-Code hinzugefügt und entfernt wird.
Einige Dinge, auf die Sie achten sollten, wenn Sie dies selbst implementieren:
Die folgende Funktion sollte alle folgenden Probleme so sauber wie möglich behandeln. Bitte hinterlassen Sie einen Kommentar, wenn Sie Probleme haben oder Verbesserungsvorschläge haben.
https://jsfiddle.net/fx6a6n6x/
quelle
Hier ist meine Einstellung dazu ...
@korayem: Beachten Sie, dass die Verwendung des HTML-
input
Felds Zeilenumbrüche nicht berücksichtigt\n
und Text in eine einzelne Zeile reduziert .Wie von @nikksan in den Kommentaren erwähnt,
textarea
wird das Problem mit using wie folgt behoben :quelle
\n
?\r\n
für einen ZeilenumbruchWenn Sie eine wirklich einfache Lösung suchen (die Integration dauert weniger als 5 Minuten) und sofort gut aussieht, ist Clippy eine gute Alternative zu einigen der komplexeren Lösungen.
Es wurde von einem Mitbegründer von GitHub geschrieben. Beispiel für einen Flash-Einbettungscode unten:
Denken Sie daran,
#{text}
den zu kopierenden Text#{bgcolor}
durch eine Farbe zu ersetzen .quelle
Das Lesen und Ändern der Zwischenablage von einer Webseite wirft Sicherheits- und Datenschutzbedenken auf. In Internet Explorer ist dies jedoch möglich. Ich habe dieses Beispiel-Snippet gefunden :
quelle
execCommand(\\’copy\\’);
bedeutet, wenn nicht in die Zwischenablage für IE kopieren? @ MrBornaif(!document.all)
aberif(!r.execCommand)
damit niemand anderes es umsetzt! Document.all ist dafür absolut nicht relevant.Ich habe kürzlich einen technischen Blog-Beitrag zu diesem Problem geschrieben (ich arbeite bei Lucidchart und wir haben kürzlich unsere Zwischenablage überarbeitet).
Das Kopieren von einfachem Text in die Zwischenablage ist relativ einfach, vorausgesetzt, Sie möchten dies während eines Systemkopierereignisses tun (der Benutzer drückt CtrlCoder verwendet das Menü des Browsers).
Das Einfügen von Text in die Zwischenablage nicht während eines Systemkopierereignisses ist viel schwieriger. Es sieht so aus, als ob einige dieser anderen Antworten auf Möglichkeiten verweisen, dies über Flash zu tun. Dies ist meines Wissens die einzige browserübergreifende Möglichkeit, dies zu tun.
Abgesehen davon gibt es einige Optionen von Browser zu Browser.
Dies ist die einfachste Version im Internet Explorer, in der Sie jederzeit über JavaScript auf das clipboardData-Objekt zugreifen können:
(Wenn Sie versuchen, dies außerhalb eines Ereignisses zum Ausschneiden, Kopieren oder Einfügen des Systems zu tun, fordert der IE den Benutzer jedoch auf, die Berechtigung für die Zwischenablage der Webanwendung zu erteilen.)
In Chrome können Sie eine Chrome-Erweiterung erstellen, mit der Sie Berechtigungen für die Zwischenablage erhalten (dies tun wir für Lucidchart). Für Benutzer mit installierter Erweiterung müssen Sie das Systemereignis nur noch selbst auslösen:
Es sieht so aus, als ob Firefox einige Optionen hat , mit denen Benutzer bestimmten Websites Berechtigungen für den Zugriff auf die Zwischenablage erteilen können, aber ich habe keine dieser Optionen persönlich ausprobiert.
quelle
clipboard.js ist ein kleines Nicht-Flash-Dienstprogramm, mit dem Text- oder HTML-Daten in die Zwischenablage kopiert werden können. Es ist sehr einfach zu bedienen, fügen Sie einfach die .js hinzu und verwenden Sie Folgendes:
clipboard.js ist auch auf GitHub .
quelle
ZeroClipboard ist die beste browserübergreifende Lösung, die ich gefunden habe:
Wenn Sie keine Flash-Unterstützung für iOS benötigen, fügen Sie einfach einen Fallback hinzu:
http://zeroclipboard.org/
https://github.com/zeroclipboard/ZeroClipboard
quelle
src
in Skript-Tags). Ich finde, dass ihre Dokumentation hübsch, aber ineffizient ist.Im Jahr 2018 können Sie folgendermaßen vorgehen:
Es wird in meinem Angular 6+ Code wie folgt verwendet:
Wenn ich eine Zeichenfolge übergebe, wird sie kopiert. Wenn nichts, wird die URL der Seite kopiert.
Es kann auch mehr Gymnastik in der Zwischenablage gemacht werden. Weitere Informationen finden Sie hier:
Entsperren des Zugriffs auf die Zwischenablage
quelle
Aus einem der Projekte, an denen ich gearbeitet habe, einem jQuery-Plugin zum Kopieren in die Zwischenablage, das die Zero Clipboard- Bibliothek verwendet.
Es ist einfacher zu verwenden als das native Zero Clipboard-Plugin, wenn Sie ein starker jQuery-Benutzer sind.
quelle
text()
anstatt,innerHTML()
wenn SieinnerHTML
seit langem browserübergreifend unterstützt. Nur weil Microsoft ursprünglich auf die Idee gekommen ist, macht es sie nicht unzuverlässig oder proprietär. Es wird jetzt auch endlich zur offiziellen Spezifikation hinzugefügt (nachdem jeder große Browser-Anbieter bereits Unterstützung dafür hinzugefügt hat ... seufz ).92KB
ist wirklich groß. Bis LTE reift GPRS ist der WW mobiler Datenstandard , und es beginnt bei1 KB/s
. Mach die Mathe selbst.Da Chrome 42+ und Firefox 41+ jetzt den Befehl document.execCommand ('copy') unterstützen . Also habe ich ein paar Funktionen für eine Cross-Browser - Copy-to-Zwischenablage Fähigkeit , eine Kombination der Verwendung von Tim Down alten Antwort und Google Developer Antwort :
quelle
Ich benutze dies sehr erfolgreich ( ohne jQuery oder ein anderes Framework).
Warnung
Tabulatoren werden in Leerzeichen konvertiert (zumindest in Chrome).
quelle
Ich habe folgende Lösung gefunden:
Beim Key-Down-Handler wird das "Pre" -Tag erstellt. Wir legen den Inhalt so fest, dass er in dieses Tag kopiert wird, treffen dann eine Auswahl für dieses Tag und geben im Handler true zurück. Dies ruft den Standard-Handler für Chrom auf und kopiert den ausgewählten Text.
Bei Bedarf können Sie das Zeitlimit für die Funktion zum Wiederherstellen der vorherigen Auswahl festlegen. Meine Implementierung auf Mootools:
Verwendungszweck:
Beim Einfügen wird ein Textbereich erstellt und funktioniert auf die gleiche Weise.
PS kann diese Lösung verwendet werden, um eine vollständig browserübergreifende Lösung ohne Flash zu erstellen. Es funktioniert in FF und Chrome.
quelle
Die anderen Methoden kopieren einfachen Text in die Zwischenablage. Um HTML zu kopieren (dh Sie können Ergebnisse in einen WSIWYG-Editor einfügen), können Sie NUR im IE Folgendes tun . Dies unterscheidet sich grundlegend von den anderen Methoden, da der Browser den Inhalt tatsächlich sichtbar auswählt.
quelle
Ich habe zusammengestellt, was ich für das Beste halte.
Hier ist es:
Verwendungszweck:
copyToClipboard('some text')
quelle
Ab Flash 10 können Sie nur dann in die Zwischenablage kopieren, wenn die Aktion aus der Benutzerinteraktion mit einem Flash-Objekt stammt. ( Lesen Sie den entsprechenden Abschnitt aus der Flash 10-Ankündigung von Adobe )
Die Lösung besteht darin, ein Flash-Objekt über der Schaltfläche "Kopieren" oder einem beliebigen Element, das das Kopieren initiiert, übermäßig zu verwenden. Zero Clipboard ist derzeit die beste Bibliothek mit dieser Implementierung. Erfahrene Flash-Entwickler möchten möglicherweise nur ihre eigene Bibliothek erstellen.
quelle
quelle
Ich habe folgende Lösung gefunden:
Ich habe den Text in einer versteckten Eingabe. Da
setSelectionRange
versteckte Eingaben nicht funktionieren, habe ich den Typ vorübergehend in Text geändert, den Text kopiert und dann wieder ausgeblendet. Wenn Sie den Text aus einem Element kopieren möchten, können Sie ihn an die Funktion übergeben und seinen Inhalt in der Zielvariablen speichern.quelle
Kopieren Sie Text von der HTML-Eingabe in die Zwischenablage:
Hinweis: Die
document.execCommand()
Methode wird in Internet Explorer 9 und früheren Versionen nicht unterstützt.Quelle : W3Schools - Kopieren Sie Text in die Zwischenablage
quelle
Es gibt bereits viele Antworten, Sie möchten jedoch eine hinzufügen (jQuery). Funktioniert hervorragend in jedem Browser, auch in mobilen Browsern (dh fordert zur Sicherheit auf, aber wenn Sie dies akzeptieren, funktioniert es einwandfrei).
In Ihrem Code:
quelle
Dies ist eine Art Kombination zwischen den anderen Antworten.
Es verwendet jQuery, muss es aber natürlich nicht. Sie können das ändern, wenn Sie möchten. Ich hatte gerade jQuery zur Verfügung. Sie können auch CSS hinzufügen, um sicherzustellen, dass die Eingabe nicht angezeigt wird. Zum Beispiel so etwas wie:
Oder Sie können natürlich auch ein Inline-Styling durchführen
quelle
textToCopy
\n
In anderen Browsern als IE müssen Sie ein kleines Flash-Objekt verwenden, um die Zwischenablage zu bearbeiten, z
quelle
Ich hatte das gleiche Problem beim Erstellen einer benutzerdefinierten Rasterbearbeitung aus (so etwas wie Excel) und der Kompatibilität mit Excel. Ich musste die Auswahl mehrerer Zellen, das Kopieren und Einfügen unterstützen.
Lösung: Erstellen Sie einen Textbereich, in den Sie Daten einfügen, die der Benutzer kopieren soll (für mich, wenn der Benutzer Zellen auswählt), konzentrieren Sie sich darauf (z. B. wenn der Benutzer drückt Ctrl) und wählen Sie den gesamten Text aus.
Wenn der Benutzer Ctrl+ Cdrückt, erhält er kopierte Zellen, die er ausgewählt hat. Nach dem Testen wurde nur die Größe des Textbereichs auf ein Pixel geändert (ich habe nicht getestet, ob es auf dem Display funktioniert: keine). Es funktioniert gut in allen Browsern und ist für den Benutzer transparent.
Einfügen - Sie können das Gleiche tun (je nach Ziel unterschiedlich) - konzentrieren Sie sich weiterhin auf Textbereiche und fangen Sie Einfügeereignisse mit onpaste ab (in meinem Projekt verwende ich Textbereiche in Zellen zum Bearbeiten).
Ich kann kein Beispiel einfügen (kommerzielles Projekt), aber Sie haben die Idee.
quelle
Ich habe clipboard.js verwendet.
Wir können es auf npm bekommen:
Und auch auf Bower
Verwendung und Beispiele finden Sie unter https://zenorocha.github.io/clipboard.js/ .
quelle
Dies ist eine Erweiterung der Antwort von @ Chase mit dem Vorteil, dass sie für IMAGE- und TABLE-Elemente funktioniert, nicht nur für DIVs in IE9.
quelle
Es scheint, dass ich die Frage falsch verstanden habe, aber als Referenz können Sie einen Bereich des DOM extrahieren (nicht in die Zwischenablage; kompatibel mit allen modernen Browsern) und ihn mit den Ereignissen oncopy und onpaste sowie onbeforepaste kombinieren, um das Verhalten der Zwischenablage zu erhalten. Hier ist der Code, um dies zu erreichen:
quelle
Mein Fehler. Dies funktioniert nur im IE.
Hier ist noch eine andere Möglichkeit, Text zu kopieren:
quelle
Dies war das einzige, was ich jemals zum Arbeiten gebracht habe, nachdem ich im Internet nach verschiedenen Möglichkeiten gesucht hatte. Dies ist ein chaotisches Thema. Es gibt viele Lösungen auf der ganzen Welt und die meisten funktionieren nicht . Das hat bei mir funktioniert:
HINWEIS: Dieser Code funktioniert nur, wenn er als direkter synchroner Code für eine onClick-Methode ausgeführt wird. Wenn Sie eine asynchrone Antwort an Ajax oder auf eine andere asynchrone Weise aufrufen, funktioniert dies nicht.
Mir ist klar, dass dieser Code eine 1 Pixel breite Komponente für eine Millisekunde sichtbar auf dem Bildschirm anzeigt, aber ich habe beschlossen, mir darüber keine Sorgen zu machen, was andere tun können, wenn es sich um ein echtes Problem handelt.
quelle
Um einen ausgewählten Text ('Zu kopierender Text') in Ihre Zwischenablage zu kopieren, erstellen Sie ein Lesezeichen (Browser-Lesezeichen, das JavaScript ausführt) und führen Sie es aus (klicken Sie darauf). Es wird ein temporärer Textbereich erstellt.
Code von GitHub:
https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d
quelle