Editar a partir de 2016
A partir de 2016, ahora puede copiar texto en el portapapeles en la mayoría de los navegadores porque la mayoría de los navegadores tienen la capacidad de copiar mediante programación una selección de texto en el portapapeles mediante el uso document.execCommand("copy")
de una selección.
Al igual que con otras acciones en un navegador (como abrir una nueva ventana), la copia al portapapeles solo se puede realizar a través de una acción específica del usuario (como un clic del mouse). Por ejemplo, no se puede hacer a través de un temporizador.
Aquí hay un ejemplo de código:
document.getElementById("copyButton").addEventListener("click", function() {
copyToClipboard(document.getElementById("copyTarget"));
});
function copyToClipboard(elem) {
// create hidden text element, if it doesn't already exist
var targetId = "_hiddenCopyText_";
var isInput = elem.tagName === "INPUT" || elem.tagName === "TEXTAREA";
var origSelectionStart, origSelectionEnd;
if (isInput) {
// can just use the original source element for the selection and copy
target = elem;
origSelectionStart = elem.selectionStart;
origSelectionEnd = elem.selectionEnd;
} else {
// must use a temporary form element for the selection and copy
target = document.getElementById(targetId);
if (!target) {
var target = document.createElement("textarea");
target.style.position = "absolute";
target.style.left = "-9999px";
target.style.top = "0";
target.id = targetId;
document.body.appendChild(target);
}
target.textContent = elem.textContent;
}
// select the content
var currentFocus = document.activeElement;
target.focus();
target.setSelectionRange(0, target.value.length);
// copy the selection
var succeed;
try {
succeed = document.execCommand("copy");
} catch(e) {
succeed = false;
}
// restore original focus
if (currentFocus && typeof currentFocus.focus === "function") {
currentFocus.focus();
}
if (isInput) {
// restore prior selection
elem.setSelectionRange(origSelectionStart, origSelectionEnd);
} else {
// clear temporary content
target.textContent = "";
}
return succeed;
}
input {
width: 400px;
}
<input type="text" id="copyTarget" value="Text to Copy"> <button id="copyButton">Copy</button><br><br>
<input type="text" placeholder="Click here and press Ctrl-V to see clipboard contents">
Aquí hay una demostración un poco más avanzada: https://jsfiddle.net/jfriend00/v9g1x0o6/
Y también puede obtener una biblioteca preconstruida que hace esto por usted con clipboard.js .
Parte antigua e histórica de la respuesta
Ningún navegador moderno permite copiar directamente al portapapeles a través de JavaScript por razones de seguridad. La solución más común es usar una capacidad Flash para copiar en el portapapeles que solo puede activarse con un clic directo del usuario.
Como ya se mencionó, ZeroClipboard es un conjunto de código popular para administrar el objeto Flash para hacer la copia. Lo he usado Si Flash está instalado en el dispositivo de navegación (que descarta móvil o tableta), funciona.
La siguiente solución más común es colocar el texto enlazado al portapapeles en un campo de entrada, mover el foco a ese campo y aconsejar al usuario que presione Ctrl+ Cpara copiar el texto.
Se pueden encontrar otras discusiones sobre el problema y posibles soluciones alternativas en estas publicaciones anteriores de Stack Overflow:
Estas preguntas que piden una alternativa moderna al uso de Flash han recibido muchas votos a favor y ninguna respuesta con una solución (probablemente porque no existe):
Internet Explorer y Firefox solían tener API no estándar para acceder al portapapeles, pero sus versiones más modernas han desaprobado esos métodos (probablemente por razones de seguridad).
Hay un esfuerzo naciente de estándares para tratar de encontrar una forma "segura" de resolver los problemas más comunes del portapapeles (probablemente requiera una acción específica del usuario como lo requiere la solución Flash), y parece que puede implementarse parcialmente en la última versión. versiones de Firefox y Chrome, pero aún no lo he confirmado.