2010-08-08 18 views
32

Estoy haciendo una extensión para Google Chrome y me he encontrado con un problema.Copiar al portapapeles en la extensión de Chrome

Necesito copiar el contenido de un solo texto de texto al portapapeles al hacer clic en la ventana emergente. ¿Alguien sabe la mejor manera de hacerlo con Javascript puro y sin Flash? También he cargado jQuery en la extensión, si eso ayuda. Mi código actual (no de trabajo) es ...

function copyHTMLCB() { 
$('#lb_html').select(); 
$('#lb_html').focus(); 
textRange = document.lb_html_frm.lb_html.createTextRange(); 
textRange.execCommand("RemoveFormat"); 
textRange.execCommand("Copy"); 
alert("HTML has been copied to your clipboard."); } 

Respuesta

5

se puede copiar al portapapeles utilizando Experimental Clipboard API, pero sólo está disponible en la rama dev de un navegador y no activado por defecto (more info) ..

+7

enlace roto, nuevas fuentes? –

+4

Esto ya no es cierto, solo necesita permisos de extensión para clipboardRead y -Write. La mejor solución actual (jQuery) parece estar aquí http://stackoverflow.com/a/7147192/1129420 – iono

+2

El enlace de la documentación está muerto – Andres

1

leí en alguna parte que hay restricciones de seguridad con Javascript que hace que deje de interactuar con el sistema operativo. He tenido éxito con ZeroClipboard en el pasado (http://code.google.com/p/zeroclipboard/), pero usa Flash. La página web Bitly lo utiliza con bastante eficacia: http://bit.ly/

3

Puede' t copia un bit de solo lectura usando execCommand("Copy"), tiene que ser un área de texto editable. La solución es crear un elemento de entrada de texto y copiar el texto desde allí. Lamentablemente, no puede ocultar ese elemento utilizando display: none o visibility: hidden ya que eso también detendrá el funcionamiento del comando de selección/copia. Sin embargo, puedes "ocultarlo" usando márgenes negativos. Esto es lo que hice en una ventana emergente de Chrome Extension que obtiene una url corta. Esta es la parte del código que reescribe la ventana emergente con el SHORTURL (enfoque rápido y sucio ;-)):

document.body.innerHTML = '<p><a href="'+shortlink+'" target="_blank" >'+shortlink+'</a><form style="margin-top: -35px; margin-left: -500px;"><input type="text" id="shortlink" value="'+shortlink+'"></form></p>' 
document.getElementById("shortlink").select() 
document.execCommand("Copy") 
16

estoy usando esta función simple copiar cualquier texto plano dado en el portapapeles (cromo solamente, utiliza jQuery):

// Copy provided text to the clipboard. 
function copyTextToClipboard(text) { 
    var copyFrom = $('<textarea/>'); 
    copyFrom.text(text); 
    $('body').append(copyFrom); 
    copyFrom.select(); 
    document.execCommand('copy'); 
    copyFrom.remove(); 
} 

// Usage example 
copyTextToClipboard('This text will be copied to the clipboard.'); 

Debido a la secuencia de datos anexados-select-copia-remove rápido, que no parece ser necesario para ocultar el área de texto o darle cualquier CSS/atributos particulares. Al menos en mi máquina, Chrome ni siquiera lo renderiza en la pantalla antes de que se elimine, incluso con trozos de texto muy grandes.

Tenga en cuenta que esto solo funcionan dentro de una extensión/aplicación de Chrome. Si está utilizando v2 manifest.json, debe declarar allí el permiso 'clipboardWrite'; esto es obligatorio para las aplicaciones y recomendado para extensiones.

+1

Respuesta realmente útil. Esto está funcionando para mí. – Touhid

34

He encontrado que la siguiente funciona mejor, ya que le permite especificar el tipo MIME de los datos copiados:

copy: function(str, mimetype) { 
    document.oncopy = function(event) { 
    event.clipboardData.setData(mimetype, str); 
    event.preventDefault(); 
    }; 
    document.execCommand("Copy", false, null); 
} 
+0

Bien, gracias. –

+0

¡Trabajado, gracias! – Meeh

30

todo el crédito va a joelpt, pero en caso de que alguien más tiene que esto funcione en javascript puro sin jQuery (Lo hice), aquí hay una adaptación de su solución:

function copyTextToClipboard(text) { 
    var copyFrom = document.createElement("textarea"); 
    copyFrom.textContent = text; 
    var body = document.getElementsByTagName('body')[0]; 
    body.appendChild(copyFrom); 
    copyFrom.select(); 
    document.execCommand('copy'); 
    body.removeChild(copyFrom); 
} 
+0

Esto funciona muy bien en background.js, ¡gracias! –

+0

Me ayuda mucho !. Muchas gracias por tomarse el tiempo para volver a hacerlo en el avión js. – LogoS

+2

¿por qué no simplemente 'document.body' en lugar de' var body = document.getElementsByTagName ('body') [0]; '? – jscripter

Cuestiones relacionadas