Aktualisierung 2020: Diese Lösung verwendet execCommand
. Während diese Funktion zum Zeitpunkt der Erstellung dieser Antwort in Ordnung war, wird sie nun als veraltet angesehen. Sie funktioniert immer noch in vielen Browsern, aber ihre Verwendung wird aufgrund möglicherweise eingestellter Unterstützung nicht empfohlen.
Es gibt einen weiteren Weg ohne Flash (abgesehen von der Clipboard-API, die in jfriend00's Antwort erwähnt wird). Sie müssen den Text auswählen und dann den Befehl copy
ausführen, um den auf der Seite ausgewählten Text in die Zwischenablage zu kopieren.
Zum Beispiel kopiert diese Funktion den Inhalt des übergebenen Elements in die Zwischenablage (aktualisiert mit Vorschlag in den Kommentaren von PointZeroTwo):
function copyToClipboard(element) {
var $temp = $("");
$("body").append($temp);
$temp.val($(element).text()).select();
document.execCommand("copy");
$temp.remove();
}
So funktioniert es:
- Erstellt ein temporär verstecktes Textfeld.
- Kopiert den Inhalt des Elements in dieses Textfeld.
- Selektiert den Inhalt des Textfelds.
- Führt den Befehl Kopieren aus wie:
document.execCommand("copy")
.
- Entfernt das temporäre Textfeld.
HINWEIS dass der Innertext des Elements Leerzeichen enthalten kann. Wenn Sie es zum Beispiel für Passwörter verwenden möchten, können Sie den Text trimmen, indem Sie $(element).text().trim()
im obigen Code verwenden.
Sie können hier eine schnelle Demo sehen:
function copyToClipboard(element) {
var $temp = $("");
$("body").append($temp);
$temp.val($(element).text()).select();
document.execCommand("copy");
$temp.remove();
}
P1: Ich bin Absatz 1
P2: Ich bin ein zweiter Absatz
Kopieren P1
Kopieren P2
Das Hauptproblem ist, dass nicht alle Browser diese Funktion im Moment unterstützen, aber Sie können sie auf den Hauptbrowsern ab verwenden:
- Chrome 43
- Internet Explorer 10
- Firefox 41
- Safari 10
Aktualisierung 1: Dies kann auch mit einer reinen JavaScript-Lösung (ohne jQuery) erreicht werden:
function copyToClipboard(elementId) {
// Ein "verstecktes" Eingabefeld erstellen
var aux = document.createElement("input");
// Weist ihm den Wert des angegebenen Elements zu
aux.setAttribute("value", document.getElementById(elementId).innerHTML);
// Füge es dem Body hinzu
document.body.appendChild(aux);
// Markieren des Inhalts
aux.select();
// Kopiere den markierten Text
document.execCommand("copy");
// Entferne es vom Body
document.body.removeChild(aux);
}
P1: Ich bin Absatz 1
P2: Ich bin ein zweiter Absatz
Kopieren P1
Kopieren P2
Beachten Sie, dass wir die ID jetzt ohne # übergeben.
Wie madzohan in den Kommentaren unten berichtet hat, gibt es in einigen Fällen ein seltsames Problem mit der 64-Bit-Version von Google Chrome (lokal ausführen der Datei). Dieses Problem scheint mit der oben genannten nicht-JQuery-Lösung behoben zu sein.
Madzohan hat es in Safari ausprobiert und die Lösung hat funktioniert, benutzt jedoch document.execCommand('SelectAll')
anstelle von .select()
(wie im Chat und in den Kommentaren unten angegeben).
Wie PointZeroTwo in den Kommentaren verdeutlicht, könnte der Code verbessert werden, so dass er ein Erfolg/Misserfolg Ergebnis zurückgibt. Sie können eine Demo auf diesem jsFiddle sehen.
AKTUALISIERUNG: KOPIEREN BEIBEHALTEN DES TEXTFORMATS
Wie ein Benutzer in der spanischen Version von StackOverflow darauf hingewiesen hat, funktionieren die oben aufgeführten Lösungen perfekt, wenn Sie den Inhalt eines Elements wortwörtlich kopieren möchten, aber sie funktionieren nicht so gut, wenn Sie den kopierten Text mit Format einfügen möchten (da er in ein input type="text"
kopiert wird, geht das Format verloren).
Eine Lösung dafür wäre, in ein editierbares div
zu kopieren und es dann auf ähnliche Weise mithilfe des execCommand
zu kopieren. Hier ist ein Beispiel - klicken Sie auf die Kopierschaltfläche und fügen Sie dann in das untenstehende editierbare Feld ein:
function copy(element_id){
var aux = document.createElement("div");
aux.setAttribute("contentEditable", true);
aux.innerHTML = document.getElementById(element_id).innerHTML;
aux.setAttribute("onfocus", "document.execCommand('selectAll',false,null)");
document.body.appendChild(aux);
aux.focus();
document.execCommand("copy");
document.body.removeChild(aux);
}
#target {
width:400px;
height:100px;
border:1px solid #ccc;
}
Fetter Text und unterstrichener Text.
Kopieren mit Format
Und in jQuery wäre es so:
function copy(selector){
var $temp = $("
#target {
width:400px;
height:100px;
border:1px solid #ccc;
}
Fetter Text und unterstrichener Text.
Kopieren mit Format