Qual é a melhor maneira de copiar texto para a área de transferência? (multi-navegador)
Eu tentei:
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);
}
}
mas no Internet Explorer, ocorre um erro de sintaxe. No Firefox, diz unsafeWindow is not defined
.
Um bom truque sem flash: como o Trello acessa a área de transferência do usuário?
javascript
clipboard
copy-paste
Santiago Corredoira
fonte
fonte
Respostas:
Visão geral
Existem três APIs principais do navegador para copiar para a área de transferência:
[navigator.clipboard.writeText]
document.execCommand('copy')
Notas gerais de desenvolvimento
Não espere que os comandos relacionados à área de transferência funcionem enquanto você estiver testando o código no console. Geralmente, é necessário que a página esteja ativa (API do Async Clipboard) ou requer interação do usuário (por exemplo, um clique do usuário) para permitir (
document.execCommand('copy')
) acessar a área de transferência, veja abaixo para obter mais detalhes.IMPORTANTE (observado aqui 2020/02/20)
Observe que, desde que esta postagem foi originalmente descontinuada por escrito, as permissões em IFRAMEs de origem cruzada e outros "sandboxing" de IFRAME impedem que as demos incorporadas "Execute o snippet de código" e o "codepen.io example" funcionem em alguns navegadores (incluindo Chrome e Microsoft Edge) )
Para desenvolver, crie sua própria página da web, sirva essa página pela conexão HTTPS para testar e desenvolver.
Aqui está uma página de teste / demonstração que demonstra o funcionamento do código: https://deanmarktaylor.github.io/clipboard-test/
Async + Fallback
Devido ao nível de suporte do navegador para a nova API do Async Clipboard, você provavelmente desejará recorrer ao
document.execCommand('copy')
método para obter uma boa cobertura do navegador.Aqui está um exemplo simples (pode não funcionar incorporado neste site, leia a nota "importante" acima):
(o exemplo do codepen.io pode não funcionar, leia a observação "importante" acima). Observe que este snippet não está funcionando bem na visualização incorporada do Stack Overflow. Você pode experimentá-lo aqui: https://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011
API de área de transferência assíncrona
Observe que existe a capacidade de "solicitar permissão" e testar o acesso à área de transferência por meio da API de permissões no Chrome 66.
document.execCommand ('copy')
O restante deste post aborda as nuances e os detalhes da
document.execCommand('copy')
API.Suporte do navegador
O
document.execCommand('copy')
suporte ao JavaScript aumentou, veja os links abaixo para atualizações do navegador:Exemplo Simples
(pode não funcionar incorporado neste site, leia a nota "importante" acima)
Exemplo complexo: Copiar para a área de transferência sem exibir a entrada
O exemplo simples acima funciona muito bem se houver um elemento
textarea
ouinput
visível na tela.Em alguns casos, você pode querer copiar texto para a área de transferência sem exibir um elemento
input
/textarea
. Este é um exemplo de uma maneira de contornar isso (basicamente insira o elemento, copie para a área de transferência, remova o elemento):Testado com Google Chrome 44, Firefox 42.0a1 e Internet Explorer 11.0.8600.17814.
(pode não funcionar incorporado neste site, leia a nota "importante" acima)
Notas Adicionais
Funciona apenas se o usuário executar uma ação
Todas as
document.execCommand('copy')
chamadas devem ocorrer como resultado direto de uma ação do usuário, por exemplo, clique em manipulador de eventos. Esta é uma medida para evitar mexer com a área de transferência do usuário quando eles não a esperam.Veja a postagem dos desenvolvedores do Google aqui para obter mais informações.
API da área de transferência
Observe que a especificação completa do rascunho da API da área de transferência pode ser encontrada aqui: https://w3c.github.io/clipboard-apis/
É suportado?
document.queryCommandSupported('copy')
deve retornartrue
se o comando "é suportado pelo navegador".document.queryCommandEnabled('copy')
retornetrue
se odocument.execCommand('copy')
for bem-sucedido se for chamado agora. Verificando para garantir que o comando foi chamado a partir de um encadeamento iniciado pelo usuário e outros requisitos sejam atendidos.No entanto, como um exemplo de problemas de compatibilidade do navegador, o Google Chrome de ~ abril a ~ outubro de 2015 retornou apenas
true
dedocument.queryCommandSupported('copy')
se o comando foi chamado a partir de um encadeamento iniciado pelo usuário.Observe os detalhes de compatibilidade abaixo.
Detalhes de compatibilidade do navegador
Enquanto um simples chamada para
document.execCommand('copy')
envolto em umtry
/catch
bloco chamado como resultado de um clique do usuário irá obter o uso mais compatibilidade a seguinte tem algumas ressalvas:Qualquer chamada para
document.execCommand
,document.queryCommandSupported
oudocument.queryCommandEnabled
deve ser agrupada em umtry
/catch
bloco.Diferentes implementações de navegador e versões de navegador lançam diferentes tipos de exceções quando chamadas em vez de retornar
false
.Diferentes implementações de navegadores ainda estão em andamento e a API da área de transferência ainda está em rascunho. Lembre-se de fazer seus testes.
fonte
var str = "word";
:?<textarea>
com JS, anexe-o adocument.body
, defina seu valor para a variável e use-o no ritmo decopyTextarea
, depois remova-o logo após a cópia do conteúdo.A cópia automática para a área de transferência pode ser perigosa; portanto, a maioria dos navegadores (exceto o IE) torna muito difícil. Pessoalmente, eu uso o seguinte truque simples:
O usuário recebe a caixa de prompt, onde o texto a ser copiado já está selecionado. Agora basta pressionar Ctrl+ Ce Enter(para fechar a caixa) - e pronto!
Agora, a operação de cópia da área de transferência é SEGURA, porque o usuário faz isso manualmente (mas de maneira bastante direta). Obviamente, funciona em todos os navegadores.
fonte
A abordagem a seguir funciona no Chrome, Firefox, Internet Explorer e Edge e nas versões recentes do Safari (o suporte à cópia foi adicionado na versão 10, lançada em outubro de 2016).
Nota: você não verá a área de texto, pois ela é adicionada e removida na mesma chamada síncrona do código Javascript.
Algumas coisas a observar se você estiver implementando isso sozinho:
A função abaixo deve lidar com todos os problemas a seguir da maneira mais limpa possível. Deixe um comentário se encontrar algum problema ou tiver sugestões para aprimorá-lo.
https://jsfiddle.net/fx6a6n6x/
fonte
Aqui está a minha opinião sobre esse ...
@ korayem: Observe que usar o
input
campo html não respeitará quebras de linha\n
e achatará qualquer texto em uma única linha.Conforme mencionado por @nikksan nos comentários, usar
textarea
corrigirá o problema da seguinte maneira:fonte
\n
?\r\n
uma quebra de linhaSe você deseja uma solução realmente simples (leva menos de 5 minutos para integrar) e fica bem logo de cara , o Clippy é uma boa alternativa para algumas das soluções mais complexas.
Foi escrito por um co-fundador do GitHub. Exemplo de código de incorporação do Flash abaixo:
Lembre-se de substituir
#{text}
pelo texto que você precisa copiar e#{bgcolor}
por uma cor.fonte
Ler e modificar a área de transferência de uma página da Web levanta preocupações de segurança e privacidade. No entanto, no Internet Explorer, é possível fazer isso. Encontrei este exemplo de trecho :
fonte
execCommand(\\’copy\\’);
que, se não copiar para a área de transferência para o IE? @mrBornaif(!document.all)
masif(!r.execCommand)
ninguém mais o implementa! Document.all é absolutamente irrelevante para isso.Recentemente, escrevi um post técnico sobre esse problema (trabalho no Lucidchart e recentemente fizemos uma revisão na nossa área de transferência).
Copiar texto sem formatação para a área de transferência é relativamente simples, supondo que você queira fazê-lo durante um evento de cópia do sistema (o usuário pressiona CtrlCou usa o menu do navegador).
Colocar o texto na área de transferência não durante um evento de cópia do sistema é muito mais difícil. Parece que algumas dessas outras respostas referenciam maneiras de fazê-lo via Flash, que é a única maneira entre navegadores de fazê-lo (pelo que entendi).
Fora isso, existem algumas opções em cada navegador.
Este é o mais simples no IE, onde você pode acessar o objeto clipboardData a qualquer momento a partir do JavaScript via:
(Quando você tenta fazer isso fora de um evento de recortar, copiar ou colar do sistema, no entanto, o IE solicitará ao usuário que conceda permissão à área de transferência do aplicativo Web.)
No Chrome, você pode criar uma extensão do Chrome que concederá permissões de área de transferência (é o que fazemos no Lucidchart). Em seguida, para usuários com sua extensão instalada, você só precisará disparar o evento do sistema:
Parece que o Firefox tem algumas opções que permitem aos usuários conceder permissões para determinados sites acessarem a área de transferência, mas eu nunca tentei nenhum deles pessoalmente.
fonte
O clipboard.js é um pequeno utilitário que não é o Flash que permite copiar dados de texto ou HTML para a área de transferência. É muito fácil de usar, basta incluir o .js e usar algo como isto:
clipboard.js também está no GitHub .
fonte
ZeroClipboard é a melhor solução entre navegadores que eu encontrei:
Se você precisar de suporte não flash para iOS, basta adicionar um fallback:
http://zeroclipboard.org/
https://github.com/zeroclipboard/ZeroClipboard
fonte
src
tags de script). Eu sinto que a documentação deles é bonita, mas ineficiente.Em 2018, veja como você pode fazer isso:
É usado no meu código Angular 6+ da seguinte forma:
Se eu passar uma string, ela a copia. Se nada, ele copia o URL da página.
Também pode ser feita mais ginástica para o material da área de transferência. Veja mais informações aqui:
Desbloqueando o acesso à área de transferência
fonte
De um dos projetos em que estou trabalhando, um plug-in de cópia para área de transferência do jQuery que utiliza a biblioteca Zero Clipboard .
É mais fácil de usar do que o plugin nativo da Zero Clipboard se você é um usuário pesado do jQuery.
fonte
text()
em vez deinnerHTML()
se você gosta ..innerHTML
é suportado em vários navegadores há muito tempo. Só porque a Microsoft originalmente teve a ideia de não torná-la não confiável ou proprietária. Agora também está finalmente sendo adicionado às especificações oficiais (depois que todos os principais fornecedores de navegadores já adicionaram suporte a ele ... suspiro ).92KB
é realmente grande. Até o LTE amadurecer, o GPRS é o padrão de dados móveis da WW e começa em1 KB/s
. Faça as contas você mesmo.Como o Chrome 42+ e o Firefox 41+ agora suportam o comando document.execCommand ('copy') . Então, criei algumas funções para a capacidade de copiar para área de transferência em vários navegadores usando uma combinação da resposta antiga de Tim Down e da resposta do desenvolvedor do Google :
fonte
Eu uso isso com muito sucesso ( sem jQuery ou qualquer outro quadro).
Atenção
As guias são convertidas em espaços (pelo menos no Chrome).
fonte
Encontrei a seguinte solução:
No manipulador de teclas, cria a tag "pre". Definimos o conteúdo para copiar para essa tag, depois fazemos uma seleção nessa tag e retornamos true no manipulador. Isso chama o manipulador padrão do chrome e copia o texto selecionado.
E, se necessário, você pode definir o tempo limite da função para restaurar a seleção anterior. Minha implementação no Mootools:
Uso:
Ao colar, ele cria uma área de texto e funciona da mesma maneira.
PS pode ser que esta solução possa ser usada para criar uma solução totalmente para vários navegadores sem flash. Seus trabalhos em FF e Chrome.
fonte
Os outros métodos copiarão texto sem formatação para a área de transferência. Para copiar HTML (ou seja, você pode colar os resultados em um editor WSIWYG), você pode fazer o seguinte no IE ONLY . Isso é fundamentalmente diferente dos outros métodos, pois o navegador realmente seleciona visivelmente o conteúdo.
fonte
Eu montei o que eu acho que é o melhor.
Aqui está:
Uso:
copyToClipboard('some text')
fonte
No Flash 10, você só pode copiar para a área de transferência se a ação se originar da interação do usuário com um objeto Flash. ( Leia a seção relacionada do anúncio do Adobe Flash 10 )
A solução é exagerar um objeto flash acima do botão Copiar ou qualquer elemento que inicia a cópia. Atualmente, a Zero Clipboard é a melhor biblioteca com esta implementação. Desenvolvedores experientes em Flash podem apenas querer criar sua própria biblioteca.
fonte
fonte
Encontrei a seguinte solução:
Eu tenho o texto em uma entrada oculta. Como
setSelectionRange
não funciona em entradas ocultas, alterei temporariamente o tipo para texto, copiei o texto e o ocultei novamente. Se você deseja copiar o texto de um elemento, pode passá-lo para a função e salvar seu conteúdo na variável de destino.fonte
Copie o texto da entrada HTML para a área de transferência:
Nota: O
document.execCommand()
método não é suportado no Internet Explorer 9 e versões anteriores.Fonte : W3Schools - Copiar texto para a área de transferência
fonte
Já existem muitas respostas, mas gostaria de adicionar uma (jQuery). Funciona muito bem em qualquer navegador, também móvel (por exemplo, avisos sobre segurança, mas quando você o aceita, funciona bem).
No seu código:
fonte
Esta é uma combinação um pouco entre as outras respostas.
Ele usa jQuery, mas não precisa, é claro. Você pode mudar isso se quiser. Eu só tinha jQuery à minha disposição. Você também pode adicionar um pouco de CSS para garantir que a entrada não seja exibida. Por exemplo, algo como:
Ou é claro, você também pode fazer um estilo embutido
fonte
textToCopy
contenha\n
Em navegadores que não sejam o IE, você precisa usar um pequeno objeto flash para manipular a área de transferência, por exemplo,
fonte
Eu tive o mesmo problema ao criar uma edição de grade personalizada (algo como Excel) e compatibilidade com o Excel. Eu tive que apoiar a seleção de várias células, copiar e colar.
Solução: crie uma área de texto na qual você inserirá dados para o usuário copiar (para mim quando o usuário estiver selecionando células), concentre-se nela (por exemplo, quando o usuário pressionar Ctrl) e selecione o texto inteiro.
Então, quando o usuário pressiona Ctrl+C ele / ela recebe as células copiadas, ele / ela seleciona. Após o teste, redimensione a área de texto para um pixel (não testei se ele funcionaria no visor: nenhum). Funciona bem em todos os navegadores e é transparente para o usuário.
Colar - você pode fazer o mesmo assim (difere no seu destino) - manter o foco na área de texto e capturar eventos de colagem usando onpaste (no meu projeto eu uso áreas de texto nas células para editar).
Não consigo colar um exemplo (projeto comercial), mas você entendeu.
fonte
Eu usei o clipboard.js.
Podemos obtê-lo em npm:
E também no Bower
O uso e os exemplos estão em https://zenorocha.github.io/clipboard.js/ .
fonte
Essa é uma expansão da resposta do @ Chase, com a vantagem de funcionar para os elementos IMAGE e TABLE, não apenas os DIVs no IE9.
fonte
Parece que eu interpretei mal a pergunta, mas para referência, você pode extrair um intervalo do DOM (não para a área de transferência; compatível com todos os navegadores modernos) e combiná-lo com os eventos oncopy e onpaste e onbeforepaste para obter o comportamento da área de transferência. Aqui está o código para conseguir isso:
fonte
Foi mal. Isso funciona apenas no IE.
Aqui está outra maneira de copiar texto:
fonte
Essa foi a única coisa em que comecei a trabalhar, depois de procurar várias maneiras pela Internet. Este é um tópico confuso. Existem muitas soluções publicadas em todo o mundo e a maioria delas não funciona. Isso funcionou para mim:
NOTA: Este código só funcionará quando executado como código síncrono direto para algo como um método 'onClick'. Se você chamar uma resposta assíncrona para o Ajax ou de qualquer outra maneira assíncrona, ele não funcionará.
Sei que esse código mostrará um componente de 1 pixel de largura visivelmente na tela por um milissegundo, mas decidi não me preocupar com isso, que é algo que outras pessoas podem resolver se for um problema real.
fonte
Para copiar um texto selecionado ('Texto para copiar') para a área de transferência, crie um Bookmarklet (marcador de navegador que executa JavaScript) e execute-o (clique nele). Ele criará uma área de texto temporária.
Código do GitHub:
https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d
fonte