Botão de copiar para a área de transferência (JavaScript e React)

Botão de copiar para a área de transferência

Botão de copiar para a área de transferência em JavaScript e React | We.Inc

Crie um botão de copiar com navigator.clipboard.writeText: demo funcional, um hook React, cópia de HTML formatado e imagens com ClipboardItem, aviso acessível de Copiado e tratamento de erros.

Chame navigator.clipboard.writeText(text) dentro de um handler de clique. Ele retorna uma promise, então use await, depois mostre uma mensagem curta de Copiado e trate o caso de erro. A API só funciona em HTTPS ou em localhost e precisa de uma ação real do usuário, como um clique, então não a chame no carregamento da página.

Formas de colocar dados na área de transferência

Um botão de copiar parece trivial, mas os trechos de código mais bem posicionados costumam pular as partes que dão errado: a promise pode ser rejeitada, frames incorporados podem ser bloqueados e usuários de leitor de tela nunca ficam sabendo que algo aconteceu. A demo abaixo copia de verdade no seu navegador, e o código cobre cada um desses casos.

Perguntas frequentes

Por que navigator.clipboard está undefined?

A página não está em um contexto seguro. A Clipboard API só fica disponível em páginas HTTPS e em localhost, então um site servido por HTTP simples ou a partir de um endereço de rede local não vai tê-la.

Por que writeText lança NotAllowedError?

O navegador recusou a escrita, geralmente porque não houve uma ação recente do usuário, a página não estava em foco ou um frame foi bloqueado pela Permissions Policy. Chame-o diretamente dentro de um handler de clique e evite awaits longos antes dele.

Preciso de uma biblioteca para copiar para a área de transferência no React?

Não. Um hook de dez linhas em volta de navigator.clipboard.writeText resolve. As bibliotecas basicamente adicionam um fallback com execCommand para navegadores muito antigos, do qual os navegadores atuais não precisam.

Dá para copiar uma imagem para a área de transferência?

Sim, com navigator.clipboard.write e um ClipboardItem cuja chave é image/png e cujo valor é um Blob PNG. Use ClipboardItem.supports() para verificar um tipo antes; PNG é o formato que os navegadores aceitam com mais confiabilidade.

document.execCommand('copy') ainda serve?

Ele está obsoleto. Ainda funciona em muitos navegadores, em condições variadas, mas código novo deve usar a Clipboard API assíncrona e, como fallback, pedir que a pessoa copie manualmente.

As três regras que o navegador impõe

Um retorno que as pessoas percebam

Cópias formatadas e eventos copy personalizados

JavaScript puro

Botão de copiar com retorno e fallback

O elemento de status fica visualmente oculto, mas é lido em voz alta. Em caso de falha, o texto é selecionado para que a pessoa possa apertar Ctrl+C ou Cmd+C.

Hook React

useCopyToClipboard

Retorna o estado e uma função de cópia. O timer é limpo na desmontagem, então nunca atualiza um componente removido.

Texto formatado, imagens e o evento copy

Copiar HTML com fallback em texto simples

Cada tipo MIME é um Blob. O destino da colagem escolhe o formato mais rico que entende.

Adicionar uma linha de fonte às cópias normais

Use com moderação. Mudar o que as pessoas copiam pode irritá-las, então limite isso a citações ou código, onde uma fonte ajuda.

Erros e suas causas

Quando a cópia falha

Copiado

Falhou

Copiar

Copiar texto formatado

Copiado para a área de transferência

A cópia falhou. Selecione o texto e pressione Ctrl+C ou Cmd+C.

Experimente

Botões de copiar para texto simples e HTML formatado, com uma caixa de colagem para conferir o resultado.

Texto para copiar

Convite:

entre na equipe

Cole aqui para conferir (Ctrl+V ou Cmd+V)

Comece grátis · Sem cartão de crédito

Relacionados: Guias

Produto

Para quem é

Recursos

Recursos

Empresa

Mapa do site