¿Cuál es la mejor manera de copiar texto al portapapeles? (multi-navegador)
Yo he tratado:
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);
}
}
pero en Internet Explorer da un error de sintaxis. En Firefox, dice unsafeWindow is not defined
.
Un buen truco sin flash: ¿cómo accede Trello al portapapeles del usuario?
javascript
clipboard
copy-paste
Santiago Corredoira
fuente
fuente
Respuestas:
Visión general
Hay tres API principales del navegador para copiar en el portapapeles:
[navigator.clipboard.writeText]
document.execCommand('copy')
Notas generales de desarrollo
No espere que los comandos relacionados con el portapapeles funcionen mientras está probando el código en la consola. En general, se requiere que la página esté activa (API del portapapeles asíncrono) o requiere la interacción del usuario (por ejemplo, un clic del usuario) para permitir que (
document.execCommand('copy')
) acceda al portapapeles. Consulte a continuación para obtener más detalles.IMPORTANTE (indicado aquí 2020/02/20)
Tenga en cuenta que, dado que esta publicación se escribió originalmente en desuso de permisos en IFRAME de origen cruzado y otros "sandboxing" de IFRAME, se evita que los demos integrados "Ejecutar fragmento de código" y "ejemplo codepen.io" funcionen en algunos navegadores (incluidos Chrome y Microsoft Edge )
Para desarrollar, cree su propia página web, sirva esa página a través de la conexión HTTPS para probar y desarrollar.
Aquí hay una página de prueba / demostración que demuestra el funcionamiento del código: https://deanmarktaylor.github.io/clipboard-test/
Async + Fallback
Debido al nivel de soporte del navegador para la nueva API Async Clipboard, es probable que desee recurrir al
document.execCommand('copy')
método para obtener una buena cobertura del navegador.Aquí hay un ejemplo simple (puede que no funcione incrustado en este sitio, lea la nota "importante" arriba):
(el ejemplo de codepen.io puede no funcionar, lea la nota "importante" anterior) Tenga en cuenta que este fragmento no funciona bien en la vista previa incrustada de Stack Overflow. Puede probarlo aquí: https://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011
API del portapapeles asíncrono
Tenga en cuenta que existe la posibilidad de "solicitar permiso" y probar el acceso al portapapeles a través de la API de permisos en Chrome 66.
document.execCommand ('copia')
El resto de esta publicación trata los matices y detalles de la
document.execCommand('copy')
API.Soporte de navegador
El
document.execCommand('copy')
soporte de JavaScript ha crecido, consulte los enlaces a continuación para obtener actualizaciones del navegador:Ejemplo simple
(puede no funcionar integrado en este sitio, lea la nota "importante" arriba)
Ejemplo complejo: copiar al portapapeles sin mostrar la entrada
El ejemplo anterior simple funciona muy bien si hay una
textarea
oinput
elemento visible en la pantalla.En algunos casos, es posible que desee copiar texto en el portapapeles sin mostrar un elemento
input
/textarea
. Este es un ejemplo de una forma de evitar esto (básicamente insertar elemento, copiar al portapapeles, eliminar elemento):Probado con Google Chrome 44, Firefox 42.0a1 e Internet Explorer 11.0.8600.17814.
(puede no funcionar integrado en este sitio, lea la nota "importante" arriba)
Notas adicionales
Solo funciona si el usuario toma una acción
Todas las
document.execCommand('copy')
llamadas deben realizarse como resultado directo de una acción del usuario, por ejemplo, haga clic en el controlador de eventos. Esta es una medida para evitar jugar con el portapapeles del usuario cuando no lo esperan.Vea la publicación de Google Developers aquí para obtener más información.
API del portapapeles
Tenga en cuenta que la especificación del borrador de la API del Portapapeles se puede encontrar aquí: https://w3c.github.io/clipboard-apis/
¿Es compatible?
document.queryCommandSupported('copy')
debería regresartrue
si el comando "es compatible con el navegador".document.queryCommandEnabled('copy')
regresartrue
sidocument.execCommand('copy')
tendrá éxito si se llama ahora. Verificación para asegurarse de que se llamó al comando desde un hilo iniciado por el usuario y se cumplen otros requisitos.Sin embargo, como un ejemplo de los problemas de compatibilidad del navegador, Google Chrome desde abril a ~ ~ de octubre de de 2015 devueltos
true
dedocument.queryCommandSupported('copy')
si el comando se llama desde un hilo iniciado por el usuario.Observe los detalles de compatibilidad a continuación.
Detalle de compatibilidad del navegador
Si bien una simple llamada a
document.execCommand('copy')
encapsulado en untry
/catch
bloque llamado como resultado de un clic del usuario obtendrá la mayor compatibilidad, el uso tiene algunas condiciones:Cualquier llamada a
document.execCommand
,document.queryCommandSupported
odocument.queryCommandEnabled
debe estar envuelto en untry
/catch
bloque.Las diferentes implementaciones y versiones de navegador lanzan diferentes tipos de excepciones cuando se llama en lugar de regresar
false
.Las diferentes implementaciones de navegador todavía están en proceso de cambio y la API del Portapapeles todavía está en borrador, así que recuerde hacer sus pruebas.
fuente
var str = "word";
:?<textarea>
con JS, añádalodocument.body
, establezca su valor en la variable y úselo a ritmocopyTextarea
, luego elimínelo inmediatamente después de copiar el contenido.La copia automática al portapapeles puede ser peligrosa, por lo tanto, la mayoría de los navegadores (excepto IE) lo hacen muy difícil. Personalmente, utilizo el siguiente truco simple:
Al usuario se le presenta el cuadro de aviso, donde el texto a copiar ya está seleccionado. Ahora es suficiente presionar Ctrl+ Cy Enter(para cerrar el cuadro) - ¡y listo!
Ahora la operación de copia del portapapeles es SEGURA, porque el usuario lo hace manualmente (pero de una manera bastante directa). Por supuesto, funciona en todos los navegadores.
fuente
El siguiente enfoque funciona en Chrome, Firefox, Internet Explorer y Edge, y en versiones recientes de Safari (se agregó soporte de copia en la versión 10 que se lanzó en octubre de 2016).
Nota: no verá el área de texto, ya que se agrega y elimina dentro de la misma invocación síncrona del código Javascript.
Algunas cosas a tener en cuenta si está implementando esto usted mismo:
La siguiente función debe manejar todos los siguientes problemas de la manera más limpia posible. Por favor, deje un comentario si encuentra algún problema o tiene alguna sugerencia para mejorarlo.
https://jsfiddle.net/fx6a6n6x/
fuente
Aquí está mi opinión sobre ese ...
@korayem: Tenga en cuenta que el uso del
input
campo html no respetará los saltos de línea\n
y aplanará cualquier texto en una sola línea.Como mencionó @nikksan en los comentarios, el uso
textarea
solucionará el problema de la siguiente manera:fuente
\n
?\r\n
un salto de líneaSi desea una solución realmente simple (se tarda menos de 5 minutos en integrarse) y se ve bien desde el primer momento, entonces Clippy es una buena alternativa a algunas de las soluciones más complejas.
Fue escrito por un cofundador de GitHub. Ejemplo de código de inserción Flash a continuación:
Recuerde reemplazar
#{text}
con el texto que necesita copiar y#{bgcolor}
con un color.fuente
Leer y modificar el portapapeles desde una página web plantea problemas de seguridad y privacidad. Sin embargo, en Internet Explorer, es posible hacerlo. Encontré este fragmento de ejemplo :
fuente
execCommand(\\’copy\\’);
hace, si no copiar al portapapeles para IE? @mrBornaif(!document.all)
peroif(!r.execCommand)
para que nadie más lo implemente! Document.all es absolutamente irrelevante para esto.Recientemente escribí una publicación técnica en un blog sobre este mismo problema (trabajo en Lucidchart y recientemente realizamos una revisión en nuestro portapapeles).
Copiar texto sin formato al portapapeles es relativamente simple, suponiendo que desee hacerlo durante un evento de copia del sistema (el usuario presiona CtrlCo usa el menú del navegador).
Poner texto en el portapapeles no durante un evento de copia del sistema es mucho más difícil. Parece que algunas de estas otras respuestas hacen referencia a formas de hacerlo a través de Flash, que es la única forma de hacerlo entre navegadores (hasta donde yo entiendo).
Aparte de eso, hay algunas opciones navegador por navegador.
Esto es lo más simple en IE, donde puede acceder al objeto clipboardData en cualquier momento desde JavaScript a través de:
(Sin embargo, cuando intente hacer esto fuera de un evento de cortar, copiar o pegar del sistema, IE solicitará al usuario que otorgue el permiso del portapapeles de la aplicación web).
En Chrome, puede crear una extensión de Chrome que le otorgará permisos de portapapeles (esto es lo que hacemos para Lucidchart). Luego, para los usuarios con su extensión instalada, solo tendrá que activar el evento del sistema usted mismo:
Parece que Firefox tiene algunas opciones que permiten a los usuarios otorgar permisos a ciertos sitios para acceder al portapapeles, pero no he probado ninguno de estos personalmente.
fuente
clipboard.js es una pequeña utilidad que no es Flash y que permite copiar texto o datos HTML en el portapapeles. Es muy fácil de usar, solo incluya el .js y use algo como esto:
clipboard.js también está en GitHub .
fuente
ZeroClipboard es la mejor solución de navegador cruzado que he encontrado:
Si necesita soporte sin flash para iOS, simplemente agregue un respaldo:
http://zeroclipboard.org/
https://github.com/zeroclipboard/ZeroClipboard
fuente
src
etiquetas de script). Siento que su documentación es bonita pero ineficiente.En 2018, así es como puedes hacerlo:
Se usa en mi código Angular 6+ así:
Si paso una cadena, la copia. Si nada, copia la URL de la página.
También se puede hacer más gimnasia para las cosas del portapapeles. Ver más información aquí:
Desbloqueo del acceso al portapapeles
fuente
De uno de los proyectos en los que he estado trabajando, un complemento jQuery de copiar al portapapeles que utiliza el Portapapeles cero biblioteca .
Es más fácil de usar que el complemento nativo Zero Clipboard si eres un gran usuario de jQuery.
fuente
text()
lugar deinnerHTML()
si lo deseas ..innerHTML
ha sido compatible con varios navegadores desde hace mucho tiempo. Solo porque a Microsoft se le ocurrió originalmente la idea, no lo hace poco confiable o propietario. Ahora también se está agregando finalmente a la especificación oficial (después de que todos los principales proveedores de navegadores ya le hayan agregado soporte ... suspiro ).92KB
es realmente grande. Hasta que LTE madure, GPRS es el estándar de datos móviles de WW , y comienza en1 KB/s
. Haz los cálculos tú mismo.Dado que Chrome 42+ y Firefox 41+ ahora son compatibles con comando document.execCommand ('copy') . Así que he creado un par de funciones para una capacidad multi-navegador de Copiar en el portapapeles utilizando una combinación de vieja respuesta de Tim hacia abajo y la respuesta de Google para desarrolladores :
fuente
Lo uso con mucho éxito ( sin jQuery o cualquier otro marco).
Advertencia
Las pestañas se convierten en espacios (al menos en Chrome).
fuente
Encontré la siguiente solución:
En el controlador de tecla abajo crea la etiqueta "pre". Configuramos el contenido para copiarlo en esta etiqueta, luego hacemos una selección en esta etiqueta y regresamos verdadero en el controlador. Esto llama al controlador estándar de Chrome y copia el texto seleccionado.
Y si lo necesita, puede configurar el tiempo de espera para la función de restaurar la selección anterior. Mi implementación en Mootools:
Uso:
Al pegar, crea textarea y funciona de la misma manera.
PS puede ser esta solución se puede utilizar para crear una solución completamente entre navegadores sin flash. Funciona en FF y Chrome.
fuente
Los otros métodos copiarán texto plano en el portapapeles. Para copiar HTML (es decir, puede pegar resultados en un editor WSIWYG), puede hacer lo siguiente en IE SOLAMENTE . Esto es fundamentalmente diferente de los otros métodos, ya que el navegador realmente selecciona visiblemente el contenido.
fuente
He reunido lo que creo que es el mejor.
Aquí está:
Uso:
copyToClipboard('some text')
fuente
A partir de Flash 10, solo puede copiar al portapapeles si la acción se origina en la interacción del usuario con un objeto Flash. ( Lea la sección relacionada del anuncio de Adobe Flash 10 )
La solución es colocar un objeto flash sobre el botón Copiar, o cualquier elemento que inicie la copia. Zero Clipboard es actualmente la mejor biblioteca con esta implementación. Los desarrolladores de Flash con experiencia pueden querer crear su propia biblioteca.
fuente
fuente
Encontré la siguiente solución:
Tengo el texto en una entrada oculta. Como
setSelectionRange
no funciona en entradas ocultas, cambié temporalmente el tipo de texto, copié el texto y luego lo oculté nuevamente. Si desea copiar el texto de un elemento, puede pasarlo a la función y guardar su contenido en la variable de destino.fuente
Copie el texto de la entrada HTML al portapapeles:
Nota: El
document.execCommand()
método no es compatible con Internet Explorer 9 y versiones anteriores.Fuente : W3Schools - Copiar texto al portapapeles
fuente
Ya hay muchas respuestas, sin embargo, me gusta agregar una (jQuery). Funciona muy bien en cualquier navegador, también en dispositivos móviles (es decir, pregunta sobre la seguridad, pero cuando lo acepta, funciona bien).
En su código:
fuente
Esta es una combinación de las otras respuestas.
Utiliza jQuery, pero no tiene que hacerlo, por supuesto. Puedes cambiar eso si quieres. Acabo de tener jQuery a mi disposición. También puede agregar un poco de CSS para asegurarse de que la entrada no se muestre. Por ejemplo algo como:
O, por supuesto, también podrías hacer un estilo en línea
fuente
textToCopy
contenga\n
En los navegadores que no sean IE, debe usar un pequeño objeto flash para manipular el portapapeles, p. Ej.
fuente
Tuve el mismo problema al crear una edición de cuadrícula personalizada (algo así como Excel) y la compatibilidad con Excel. Tuve que soportar seleccionar varias celdas, copiar y pegar.
Solución: cree un área de texto donde inserte datos para que el usuario los copie (para mí cuando el usuario selecciona celdas), establezca el foco en él (por ejemplo, cuando el usuario presiona Ctrl ) y seleccione todo el texto.
Entonces, cuando el usuario presiona Ctrl+C él / ella obtiene las celdas copiadas que él / ella seleccionó. Después de probar, simplemente redimensionar el área de texto a un píxel (no probé si funcionará en la pantalla: ninguno). Funciona bien en todos los navegadores, y es transparente para el usuario.
Pegar: podría hacer lo mismo (difiere en su objetivo): manténgase enfocado en textarea y capture eventos de pegar usando onpaste (en mi proyecto uso textareas en celdas para editar).
No puedo pegar un ejemplo (proyecto comercial), pero entiendes la idea.
fuente
He usado clipboard.js.
Podemos obtenerlo en npm:
Y también en Bower
El uso y los ejemplos están en https://zenorocha.github.io/clipboard.js/ .
fuente
Esta es una expansión de la respuesta de @ Chase, con la ventaja de que funcionará para elementos de IMAGEN y TABLA, no solo DIV en IE9.
fuente
Parece que leí mal la pregunta, pero como referencia, puede extraer un rango del DOM (no al portapapeles; compatible con todos los navegadores modernos) y combinarlo con los eventos oncopy y onpaste y onbeforepaste para obtener el comportamiento del portapapeles. Aquí está el código para lograr esto:
fuente
Culpa mía. Esto solo funciona en IE.
Aquí hay otra forma de copiar texto:
fuente
Esto fue lo único que pude trabajar, después de buscar varias maneras en Internet. Este es un tema desordenado. Hay muchas soluciones publicadas en todo el mundo y la mayoría de ellas no funcionan. Esto funcionó para mí:
NOTA: Este código solo funcionará cuando se ejecute como código síncrono directo a algo como un método 'onClick'. Si llama en una respuesta asincrónica a Ajax o de cualquier otra forma asincrónica, no funcionará.
Me doy cuenta de que este código mostrará un componente de 1 píxel de ancho visible en la pantalla durante un milisegundo, pero decidí no preocuparme por eso, que es algo que otros pueden abordar si es un problema real.
fuente
Para copiar un texto seleccionado ('Texto para copiar') a su portapapeles, cree un Bookmarklet (marcador de navegador que ejecute JavaScript) y ejecútelo (haga clic en él). Creará un área de texto temporal.
Código de GitHub:
https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d
fuente