Divulgación: escribí el código que usa Trello ; El siguiente código es el código fuente real que Trello usa para lograr el truco del portapapeles.
En realidad, no "accedemos al portapapeles del usuario", sino que ayudamos al usuario un poco seleccionando algo útil cuando presionan Ctrl+ C.
Parece que lo has descubierto; aprovechamos el hecho de que cuando quieres presionar Ctrl+ C, Ctrlprimero debes presionar la tecla. Cuando Ctrlse presiona la tecla, introducimos un área de texto que contiene el texto que queremos terminar en el portapapeles y seleccionamos todo el texto que contiene, de modo que la selección se establece cuando se Cpresiona la tecla. (Luego ocultamos el área de texto cuando Ctrlaparece la clave)
Específicamente, Trello hace esto:
TrelloClipboard = new class
constructor: ->
@value = ""
$(document).keydown (e) =>
# Only do this if there's something to be put on the clipboard, and it
# looks like they're starting a copy shortcut
if !@value || !(e.ctrlKey || e.metaKey)
return
if $(e.target).is("input:visible,textarea:visible")
return
# Abort if it looks like they've selected some text (maybe they're trying
# to copy out a bit of the description or something)
if window.getSelection?()?.toString()
return
if document.selection?.createRange().text
return
_.defer =>
$clipboardContainer = $("#clipboard-container")
$clipboardContainer.empty().show()
$("<textarea id='clipboard'></textarea>")
.val(@value)
.appendTo($clipboardContainer)
.focus()
.select()
$(document).keyup (e) ->
if $(e.target).is("#clipboard")
$("#clipboard-container").empty().hide()
set: (@value) ->
En el DOM tenemos
<div id="clipboard-container"><textarea id="clipboard"></textarea></div>
CSS para el material del portapapeles:
#clipboard-container {
position: fixed;
left: 0px;
top: 0px;
width: 0px;
height: 0px;
z-index: 100;
display: none;
opacity: 0;
}
#clipboard {
width: 1px;
height: 1px;
padding: 0px;
}
... y el CSS hace que no se pueda ver el área de texto cuando aparece ... pero es lo suficientemente "visible" para copiar.
Cuando pasas el mouse sobre una tarjeta, llama
TrelloClipboard.set(cardUrl)
... entonces el ayudante del portapapeles sabe qué seleccionar cuando Ctrlse presiona la tecla.