Quando você passa o mouse sobre um cartão no Trello e pressiona Ctrl+ C, o URL desse cartão é copiado para a área de transferência. Como eles fazem isso?
Até onde eu sei, não há nenhum filme em Flash envolvido. Eu tenho o Flashblock instalado e a guia de rede do Firefox não mostra nenhum filme em Flash carregado. (Esse é o método usual, por exemplo, pelo ZeroClipboard.)
Como eles conseguem essa mágica?
(Neste exato momento, acho que tive uma epifania: você não pode selecionar texto na página, portanto, suponho que eles tenham um elemento invisível, onde eles criam uma seleção de texto via código JavaScript e Ctrl+ Caciona o comportamento padrão do navegador, copiando o invisível valor de texto do nó.)
javascript
coffeescript
clipboard
trello
Boldewyn
fonte
fonte
Respostas:
Divulgação: escrevi o código que o Trello usa ; o código abaixo é o código-fonte real que o Trello usa para realizar o truque da área de transferência.
Na verdade, não "acessamos a área de transferência do usuário", em vez disso, ajudamos um pouco o usuário selecionando algo útil quando pressionamos Ctrl+ C.
Parece que você já descobriu; aproveitamos o fato de que, quando você deseja pressionar Ctrl+ C, deve pressionar a Ctrltecla primeiro. Quando a Ctrltecla é pressionada, exibimos uma área de texto que contém o texto que queremos terminar na área de transferência e selecionamos todo o texto nela, para que a seleção esteja definida quando a Ctecla for pressionada. (Então, ocultamos a área de texto quando a Ctrlchave é exibida)
Especificamente, o Trello faz isso:
No DOM, temos
CSS para o material da área de transferência:
... e o CSS faz com que você não consiga ver a área de texto quando ela aparece ... mas é "visível" o suficiente para copiar.
Quando você passa o mouse sobre um cartão, ele chama
... para que o auxiliar da área de transferência saiba o que selecionar quando a Ctrltecla for pressionada.
fonte
Na verdade, criei uma extensão do Chrome que faz exatamente isso e para todas as páginas da web. O código fonte está no GitHub .
Encontro três bugs com a abordagem do Trello, que eu sei porque os enfrentei :)
A cópia não funciona nesses cenários:
Resolvi o número 1 sempre tendo um intervalo oculto, em vez de criar um quando o usuário clica em Ctrl/ Cmd.
Eu resolvi o número 2 limpando temporariamente a seleção de comprimento zero, salvando a posição do cursor, fazendo a cópia e restaurando a posição do cursor.
Ainda não encontrei uma correção para o # 3 :) (Para obter informações, verifique o problema em aberto no meu projeto do GitHub).
fonte
Com a ajuda do código da capa de chuva ( link para o GitHub ), consegui obter uma versão em execução acessando a área de transferência com JavaScript simples.
O único problema é que esta versão funciona apenas com o Chrome. A plataforma Trello suporta todos os navegadores. O que estou perdendo?Agradecido por VadimIvanov.
Veja um exemplo de trabalho: http://jsfiddle.net/AGEf7/
fonte
el.innerText
estava indefinido, então mudei a última linha daclipboard()
funçãoclip.setValue(el.innerText || el.textContent);
para mais compatibilidade entre navegadores. link: jsfiddle.net/AGEf7/31O código de Daniel LeCheminant não funcionou para mim depois de convertido do CoffeeScript para JavaScript ( js2coffee ). Continuava bombardeando a
_.defer()
linha.Presumi que isso tivesse algo a ver com adiados do jQuery, então mudei para
$.Deferred()
e está funcionando agora. Eu testei no Internet Explorer 11, Firefox 35 e Chrome 39 com o jQuery 2.1.1. O uso é o mesmo descrito na postagem de Daniel.fonte
Algo muito semelhante pode ser visto em http://goo.gl quando você diminui o URL.
Há um elemento de entrada somente leitura que é focado programaticamente, com a dica de ferramenta pressionada CTRL-Cpara copiar.
Quando você pressiona esse atalho, o conteúdo de entrada entra efetivamente na área de transferência. Really nice :)
fonte