Botón de copiar al portapapeles (JavaScript y React)

Botón de copiar al portapapeles

Botón de copiar al portapapeles en JavaScript y React | We.Inc

Crea un botón de copiar con navigator.clipboard.writeText: demo funcional, un hook de React, copia de HTML enriquecido e imágenes con ClipboardItem, aviso accesible de Copiado y errores.

Ejecuta navigator.clipboard.writeText(text) desde un handler de clic. Devuelve una promesa, así que espérala con await, muestra un breve mensaje de Copiado y captura el caso de error. La API solo funciona en HTTPS o en localhost, y necesita una acción real del usuario como un clic, así que no la ejecutes al cargar la página.

Formas de poner datos en el portapapeles

Un botón de copiar parece trivial, pero los fragmentos que mejor posicionan suelen saltarse lo que falla: la promesa puede rechazarse, los marcos incrustados pueden estar bloqueados y los usuarios de lectores de pantalla nunca se enteran de que ha pasado algo. La demo de abajo copia de verdad en tu navegador, y el código cubre cada uno de esos casos.

Preguntas frecuentes

¿Por qué navigator.clipboard es undefined?

La página no está en un contexto seguro. La Clipboard API solo está disponible en páginas HTTPS y en localhost, así que un sitio servido por HTTP simple o desde una dirección de red local no la tendrá.

¿Por qué writeText lanza NotAllowedError?

El navegador rechazó la escritura, normalmente porque no hubo una acción reciente del usuario, la página no tenía el foco o Permissions Policy bloqueó un marco. Ejecútalo directamente dentro de un handler de clic y evita esperas largas con await antes.

¿Necesito una librería para copiar al portapapeles en React?

No. Un hook de diez líneas alrededor de navigator.clipboard.writeText es suficiente. Las librerías añaden sobre todo una alternativa con execCommand para navegadores muy antiguos, que los navegadores actuales no necesitan.

¿Puedo copiar una imagen al portapapeles?

Sí, con navigator.clipboard.write y un ClipboardItem cuya clave sea image/png y cuyo valor sea un Blob PNG. Usa ClipboardItem.supports() para comprobar antes un tipo; PNG es el formato que los navegadores aceptan de forma más fiable.

¿Sigue siendo válido document.execCommand('copy')?

Está obsoleto. Todavía funciona en muchos navegadores bajo condiciones variables, pero el código nuevo debería usar la Clipboard API asíncrona y, como alternativa, pedir a la persona que copie manualmente.

Las tres reglas que impone el navegador

Un aviso que la gente pueda percibir

Copias enriquecidas y eventos copy personalizados

JavaScript puro

Botón de copiar con aviso y alternativa

El elemento de estado está oculto visualmente pero se lee en voz alta. Si falla, el texto queda seleccionado para que la persona pueda pulsar Ctrl+C o Cmd+C.

Hook de React

useCopyToClipboard

Devuelve el estado y una función de copia. El temporizador se limpia al desmontar, así que nunca actualiza un componente eliminado.

Texto enriquecido, imágenes y el evento copy

Copiar HTML con alternativa en texto plano

Cada tipo MIME es un Blob. El destino donde se pega elige el formato más rico que entiende.

Añadir una línea con la fuente a las copias normales

Úsalo con moderación. Cambiar lo que la gente copia puede molestar, así que limítalo a citas o código donde la fuente aporte algo.

Errores y sus causas

Cuando la copia falla

Copiado

Error

Copiar

Copiar texto enriquecido

Copiado al portapapeles

No se pudo copiar. Selecciona el texto y pulsa Ctrl+C o Cmd+C.

Pruébalo

Botones de copiar para texto plano y HTML enriquecido, con un cuadro para pegar y comprobar el resultado.

Texto que copiar

Invitación:

únete al equipo

Pega aquí para comprobar (Ctrl+V o Cmd+V)

Empieza gratis · Sin tarjeta de crédito

Relacionado: Guías

Producto

Para quién es

Funciones

Recursos

Empresa

Mapa del sitio