¿Cómo copio el texto dentro de un div en el portapapeles? Tengo un div y necesito agregar un enlace que agregará el texto al portapapeles. ¿Existe alguna solucion para esto?
<p class="content">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s</p>
<a class="copy-text">copy Text</a>
Después de hacer clic en copiar texto, luego presiono Ctrl+ V, debe pegarse.
Respuestas:
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:
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:
¿Cómo copio al portapapeles en JavaScript?
¿Cómo copiar texto al portapapeles del cliente usando jQuery?
¿Cómo se puede copiar al portapapeles sin Flash?
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):
¿Alternativa HTML5 al ZeroClipboard basado en flash para la copia segura de datos al portapapeles?
Copiar al portapapeles sin Flash
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.
fuente
document.execCommand("copy")
en suficientes circunstancias para confiar en su uso para esto. Por lo tanto, estoy tratando de mantener mi respuesta actualizada (que fue originalmente creada hace casi 2 años). Todavía no tenemos una solución confiable para Safari que no sea preseleccionar el texto y decirle al usuario que presione manualmente Ctrl + C, pero al menos se está avanzando en otro lugar.document.execCommand("copy")
por lo que este código debería funcionar en Safari 10.Hay otra forma que no es Flash (aparte de la API del Portapapeles mencionada en la respuesta de jfriend00 ). Debe seleccionar el texto y luego ejecutar el comando
copy
para copiar en el portapapeles el texto seleccionado actualmente en la página.Por ejemplo, esta función copiará el contenido del elemento pasado en el portapapeles (actualizado con una sugerencia en los comentarios de PointZeroTwo ):
Así es como funciona:
document.execCommand("copy")
.Puedes ver una demostración rápida aquí:
El problema principal es que no todos los navegadores admiten esta función en este momento, pero puede usarla en los principales desde:
Actualización 1: Esto se puede lograr también con una solución de JavaScript puro (sin jQuery):
Observe que pasamos la identificación sin el # ahora.
Como madzohan informó en los comentarios a continuación, hay algunos problemas extraños con la versión de 64 bits de Google Chrome en algunos casos (ejecutar el archivo localmente). Este problema parece solucionarse con la solución anterior que no es jQuery.
Madzohan lo intentó en Safari y la solución funcionó pero usando en
document.execCommand('SelectAll')
lugar de usar.select()
(como se especifica en el chat y en los comentarios a continuación).Como PointZeroTwo señala en los comentarios , el código podría mejorarse para que arroje un resultado de éxito / fracaso. Puede ver una demostración en este jsFiddle .
ACTUALIZACIÓN: COPIA MANTENIENDO EL FORMATO DE TEXTO
Como señaló un usuario en la versión en español de StackOverflow , las soluciones enumeradas anteriormente funcionan perfectamente si desea copiar el contenido de un elemento literalmente, pero no funcionan tan bien si desea pegar el texto copiado con formato (como se copia en un
input type="text"
, el formato se "pierde").Una solución para eso sería copiar en un contenido editable
div
y luego copiarlo usando de laexecCommand
misma manera. Aquí hay un ejemplo: haga clic en el botón Copiar y luego péguelo en el cuadro editable de contenido a continuación:Y en jQuery, sería así:
fuente
aux.style.position = "fixed";
aux.style.top = 0;
arriba de laappendChild
llamada.clipboard.js es una buena utilidad que permite copiar texto o datos HTML al portapapeles sin usar Flash. Es muy fácil de usar; solo incluya el .js y use algo como esto:
clipboard.js también está en GitHub .
Editar el 15 de enero de 2016: la respuesta principal se editó hoy para hacer referencia a la misma API en mi respuesta publicada en agosto de 2015. El texto anterior instruía a los usuarios a usar ZeroClipboard. Solo quiero dejar en claro que no saqué esto de la respuesta de jfriend00, sino al revés.
fuente
Simplicidad es la máxima sofisticación.
Si no desea que el texto a copiar sea visible:
jQuery:
HTML:
fuente
Con saltos de línea (extensión de la respuesta de Álvaro Montoro)
fuente
Puede usar este código para copiar el valor de entrada en la página en el Portapapeles haciendo clic en un botón
Esto es HTML
Luego, para este html, debemos usar este código JQuery
Esta es la solución más simple para esta pregunta.
fuente
Un enfoque aún mejor sin flash o cualquier otro requisito es clipboard.js . Todo lo que necesita hacer es agregar
data-clipboard-target="#toCopyElement"
cualquier botón, inicializarlonew Clipboard('.btn');
y copiará el contenido de DOM con idtoCopyElement
al portapapeles. Este es un fragmento que copia el texto proporcionado en su pregunta a través de un enlace.Sin embargo, una limitación es que no funciona en safari, pero funciona en todos los demás navegadores, incluidos los navegadores móviles, ya que no utiliza flash
fuente
fuente
fuente
.addClass("hidden")
a la<input>
etiqueta para que nunca aparezca en el navegador?Es muy importante que el campo de entrada no tenga
display: none
. El navegador no seleccionará el texto y, por lo tanto, no se copiará. Useopacity: 0
con un ancho de 0px para solucionar el problema.fuente
Es un método más simple para copiar el contenido.
fuente
Solución simple jQuery.
Debe ser activado por el clic del usuario.
fuente
¡puedes usar esta lib para realizar fácilmente el objetivo de la copia!
https://clipboardjs.com/
o
https://github.com/zeroclipboard/zeroclipboard
http://zeroclipboard.org/
fuente
El texto a copiar está en la entrada de texto, como:
<input type="text" id="copyText" name="copyText">
y, al hacer clic en el botón, el texto sobre el texto debe copiarse en el portapapeles, por lo que el botón es como:<button type="submit" id="copy_button" data-clipboard-target='copyText'>Copy</button>
Su secuencia de comandos debería ser como:Para archivos CDN
nota :
ZeroClipboard.swf
yZeroClipboard.js
"el archivo debe estar en la misma carpeta que el archivo que usa esta funcionalidad, O debe incluirlo como lo incluimos<script src=""></script>
en nuestras páginas.fuente
La mayoría de las respuestas propuestas crean un elemento (s) de entrada oculto temporal adicional. Debido a que la mayoría de los navegadores hoy en día admiten la edición de contenido div, propongo una solución que no crea elementos ocultos, conserva el formato de texto y utiliza JavaScript puro o la biblioteca jQuery.
Aquí hay una implementación esqueleto minimalista que utiliza la menor cantidad de líneas de códigos que se me ocurren:
fuente
La biblioteca Clipboard-polyfill es un polyfill para la moderna API de portapapeles asíncrona basada en Promise.
instalar en CLI:
importar como portapapeles en archivo JS
ejemplo
Lo estoy usando en un paquete
require("babel-polyfill");
y lo probé en Chrome 67. Todo bien para la producción.fuente
código html aquí
CÓDIGO JS:
fuente
puede copiar un texto individual aparte del texto de un elemento HTML.
fuente
JS puro, sin onclick en línea, para clases emparejadas "contenido - botón de copia". Sería más cómodo, si tienes muchos elementos)
Soporte de navegador antiguo:
Mostrar fragmento de código
fuente
Ambos funcionarán como un encanto :),
JAVASCRIPT:
También en html,
JQUERY: https://paulund.co.uk/jquery-copy-clipboard
fuente