Enquanto esperava impacientemente pelo suporte do Xbrowser para a API Clipboard ...
Isso funcionará perfeitamente no
Chrome, Firefox, Edge, IE
O IE solicitará ao usuário apenas uma vez para acessar a área de transferência.
Safari (5.1 no momento da escrita) não oferece suporte execCommand
paracopy/cut
/**
* CLIPBOARD
* https://stackoverflow.com/a/33337109/383904
*/
const clip = e => {
e.preventDefault();
const cont = e.target.innerHTML;
const area = document.createElement("textarea");
area.value = e.target.innerHTML; // or use .textContent
document.body.appendChild(area);
area.select();
if(document.execCommand('copy')) console.log("Copied to clipboard");
else prompt("Copy to clipboard:\nSelect, Cmd+C, Enter", cont); // Saf, Other
area.remove();
};
[...document.querySelectorAll(".clip")].forEach(el =>
el.addEventListener("click", clip)
);
<a class="clip" href="#!">Click an item to copy</a><br>
<a class="clip" href="#!"><i>Lorem</i></a><br>
<a class="clip" href="#!"><b>IPSUM</b></a><br>
<textarea placeholder="Paste here to test"></textarea>
Todos os navegadores (exceto o Firefox, que só consegue lidar com o tipo MIME "plain/text"
, até onde testei) não implementaram a API Clipboard . Ou seja, tentando ler o evento da área de transferência no Chrome usando
var clipboardEvent = new ClipboardEvent("copy", {
dataType: "plain/text",
data: "Text to be sent to clipboard"
});
throws: Uncaught TypeError: Illegal constructor
O melhor recurso da incrível bagunça que está acontecendo entre os navegadores e a área de transferência pode ser visto aqui (caniuse.com) (→ Siga os comentários em "Notas" ).
MDN diz que o suporte básico é "(SIM)" para todos os navegadores, o que é impreciso porque seria de se esperar que pelo menos a API funcionasse.