Existem muitos plug-ins de terceiros que podem implementar a função de cópia, mas se fizermos isso sozinhos, saberemos como implementá-la?
Este artigo apresenta três opções de implementação.
usando API Async Clipboard
Este método é o mais fácil de usar, mas a compatibilidade não é muito boa e há muitos requisitos.
Código de exemplo:
const promessa = navigator.clipboard.writeText(newClipText);
Observe que o valor de retorno do método é uma promessa. E ao usar este método, a página deve estar em foco, caso contrário será relatado um erro.
usa Document.execCommand
Embora este método tenha sido abandonado e não seja mais um padrão da web, ele tem muitos fatores históricos e acredito que os navegadores irão suportá-lo por muito tempo.
<p id="content">123456</p> <button id="copyButton">Copiar</button>
Ao copiar elementos DOM, você precisa usar a API de seleção e a API de intervalo adicionalmente.
developer.mozilla.org/en-US/docs/…
developer.mozilla.org/en-US/docs/…
Código de exemplo:
const copyButton = document.getElementById('copyButton'); const conteúdo = document.getElementById('conteúdo'); copyButton.addEventListener('clique', function() { seleção const = window.getSelection(); intervalo const = document.createRange(); //Definir o conteúdo selecionado range.selectNodeContents(content); // Limpa a seleção selection.removeAllRanges(); //Adiciona conteúdo selecionado selection.addRange(range); document.execCommand('copiar'); });
A seleção precisa ser limpa primeiro e depois o intervalo é adicionado.
Há um problema de detalhe aqui. Depois de clicar no botão copiar, o conteúdo copiado é selecionado, o que é um pouco abrupto.
A solução é chamar selection.removeAllRanges()
após a conclusão da cópia para limpar a seleção.
Considere outra situação em que o usuário seleciona parte da página antes de copiá-la. Após a conclusão da cópia, além de limpar o conteúdo da cópia selecionado, você também precisa restaurar o conteúdo que o usuário selecionou antes de copiar.
O código de implementação é o seguinte:
const copyButton = document.getElementById('copyButton'); const conteúdo = document.getElementById('conteúdo'); copyButton.addEventListener('clique', function() { seleção const = window.getSelection(); intervalo const = document.createRange(); //Armazena em cache o conteúdo selecionado pelo usuário const currentRange = seleção.rangeCount === 0? nulo: seleção.getRangeAt(0); //Definir fragmento do documento range.selectNodeContents(content); // Limpa a seleção selection.removeAllRanges(); //Define o fragmento do documento como o conteúdo selecionado selection.addRange(range); tentar { // Copiar para a área de transferência document.execCommand('copy'); } pegar (errar) { // Avisa que a cópia falhou} finalmente { seleção.removeAllRanges(); if (intervaloatual) { //Restaura o conteúdo selecionado pelo usuário selection.addRange(currentRange); } } });
Primeiro armazene em cache o conteúdo selecionado pelo usuário e restaure-o após a conclusão da cópia.
e use o método select
do objeto do elemento de entrada para selecionar o conteúdo. Não há necessidade de criar um fragmento de intervalo para definir o conteúdo selecionado.
Código de exemplo:
const copyButton = document.getElementById('copyButton'); const inputEl = document.getElementById('input'); copyButton.addEventListener('clique', function() { seleção const = window.getSelection(); const intervalo atual = seleção.rangeCount === 0? nulo: seleção.getRangeAt(0); //Selecione o conteúdo de entrada inputEl.select(); //Copia para a área de transferência try { document.execCommand('copiar'); } pegar (errar) { // Avisa que a cópia falhou // . . . } finalmente { seleção.removeAllRanges(); if (intervaloatual) { //Restaura o conteúdo selecionado pelo usuário selection.addRange(currentRange); } } });
Clicar no botão copiar também não removerá o conteúdo selecionado anteriormente.
w3c.github.io/clipboard-a…
Cite um trecho de código no link acima como exemplo:
// Substitua o que está sendo copiado para a área de transferência. document.addEventListener('copiar', função (e) { // e.clipboardData está inicialmente vazio, mas podemos configurá-lo para o // dados que queremos copiar para a área de transferência. e.clipboardData.setData('text/plain', 'Ovos mexidos ocidentais'); // Isto é necessário para evitar que a seleção do documento atual seja // sendo gravado na área de transferência. e.preventDefault(); });
Copie qualquer conteúdo da página e cole o conteúdo de saída será "Ovos mexidos ocidentais".