Copiar el texto seleccionado al portapapeles SIN usar flash-debe ser cross-browser


Quiero tener un botón que selecciona el texto en un textarea y lo copia en el portapapeles. Parece que no puedo encontrar ninguna solución que funcione en todos los navegadores y no use flash.

Seguramente esto es factible? Lo he visto por todas partes, pero supongo que usan flash, del que realmente quiero alejarme si es posible, ya que algunas personas no lo tienen.

Esto es lo que tengo hasta ahora - solo selecciona el texto:

function copyCode() {
  $("#output-code").focus();
  $("#output-code").select();
}

(El enfoque no es estrictamente necesario)

Author: Nick Brunt, 2011-06-10

5 answers

ExecCommand ('copy')

Hay una opción muy nueva. Es cross-browser, pero tomará tiempo hasta que todos hayan actualizado su navegador.

Funciona usando la función document.execCommand('copy');. Con esta función copiarás el texto select. Esto no solo funcionará con textareas, sino con cada texto seleccionado en la página web (como en span, p, div, etc.).

Disponible en Internet Explorer 10+, Chrome 43+, Opera 29 + y Firefox 41 +(ver execCommand compatibilidad aquí).

Ejemplo

// Setup the variables
var textarea = document.getElementById("textarea");
var answer  = document.getElementById("copyAnswer");
var copy    = document.getElementById("copyBlock");
copy.addEventListener('click', function(e) {

   // Select some text (you could also create a range)
   textarea.select(); 

   // Use try & catch for unsupported browser
   try {

       // The important part (copy selected text)
       var ok = document.execCommand('copy');

       if (ok) answer.innerHTML = 'Copied!';
       else    answer.innerHTML = 'Unable to copy!';
   } catch (err) {
       answer.innerHTML = 'Unsupported Browser!';
   }
});
<textarea id="textarea" rows="6" cols="40">
Lorem ipsum dolor sit amet, eamsemper maiestatis no.
</textarea><br/>

<button id="copyBlock">Click to copy</button> <span id="copyAnswer"></span>
   
 58
Author: arcs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-23 17:08:43

Debe usar el complemento de Flash que no desea usar para copiar automáticamente el texto al portapapeles del cliente. Un sitio web que modifica automáticamente el portapapeles del cliente sin la ayuda de componentes active-x es un problema de seguridad. Tenga en cuenta que los componentes active-x son programas que se ejecutan en el equipo del usuario y, técnicamente, requieren el consentimiento del usuario para ser instalados. Teniendo en cuenta que el portapapeles es un componente del sistema operativo, estar feliz de que los navegadores web no permiten sitios web para highjack predeterminada.

Si el usuario no tiene Flash, tiene Flash desactivado, o tiene active-x desactivado, entonces él o ella probablemente está paranoico acerca de la seguridad y no quiere que te metas con su teclado de todos modos. En ese momento, el usuario estaría acostumbrado a no tener mucha funcionalidad automática o basada en scripts en los sitios web. Es mejor no intentar desafiar abiertamente los deseos del usuario final.

Consulte los siguientes enlaces de desbordamiento de pila:

  1. ¿Cómo copio a la portapapeles en JavaScript?
  2. Detección de Flash de Navegador cruzado en Javascript

La respuesta definitiva es usar Cero Portapapeles, que es una biblioteca que utiliza una película Flash pequeña e invisible y JavaScript para usar la funcionalidad del portapapeles como desea. La biblioteca está disponible aquí: https://github.com/zeroclipboard/zeroclipboard El segundo enlace muestra cómo detectar si Flash está deshabilitado o no instalado, lo que le permite mostrar una advertencia mensaje como lo harías para JavaScript.

 18
Author: Devin Burke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:10

Ahora tenemos Portapapeles.js por @ zenorocha

Para usarlo, descargue y llame al script en su página.html (o instalar con bower o npm)

<script src="path_to_script/clipboard.min.js"></script>

Crea una instancia de un nuevo disparador en tu script.js

new Clipboard('.trigger');

Y ve allí para ver algunos ejemplos de uso: http://zenorocha.github.io/clipboard.js/#usage

 9
Author: Gabriel Gularte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-02 22:19:21
function copyTextToClipboard(text) {
    var textArea = document.createElement("textarea");
    textArea.style.position = 'fixed';
    textArea.style.top = 0;
    textArea.style.left = 0;  
    textArea.style.width = '2em';
    textArea.style.height = '2em'; 
    textArea.style.padding = 0;  
    textArea.style.border = 'none';
    textArea.style.outline = 'none';
    textArea.style.boxShadow = 'none';   
    textArea.style.background = 'transparent';
    textArea.value = text;
    textArea.id = 'ta';
    document.body.appendChild(textArea);
    //textArea.select();
    var range = document.createRange();
    range.selectNode(textArea);
    textArea.select();
    window.getSelection().addRange(range);
    try {
        var successful = document.execCommand('copy');
    } catch (err) {
         alert('Oops, unable to copy');
    }
    document.body.removeChild(textArea);
    return successful;
}

Espero que esto sea útil

 6
Author: Iyappan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-02 15:15:47

Esta es una respuesta bastante tardía, pero para aquellos que buscan en el futuro y tienen problemas con la implementación del evento execCommand('copy') para que funcione tanto para dispositivos de escritorio como móviles.

Navegador cruzado, compatible con dispositivos móviles y sin necesidad de tener fuentes o programas externos

function CopyString(){
    var StringToCopyElement = document.getElementById('YourId');
    StringToCopyElement.select();

    if(document.execCommand('copy')){
        StringToCopyElement.blur();     
    }else{
        CopyStringMobile();
    }
}

function CopyStringMobile(){
    document.getElementById("YourId").selectionStart = 0;
    document.getElementById("YourId").selectionEnd = 999;
    document.execCommand('copy');

    if (window.getSelection) {
      if (window.getSelection().empty) {  // Chrome
        window.getSelection().empty();
      } else if (window.getSelection().removeAllRanges) {  // Firefox
        window.getSelection().removeAllRanges();
      }
    } else if (document.selection) {  // IE?
      document.selection.empty();
    }
}

Establece la función CopyString() en un evento click en lo que estés buscando para disparar el evento. Esto está disponible para ser utilizado tanto en el funcionamiento móvil y de escritorio sistema.

Explicación

Necesita tener dos formas diferentes de seleccionar la cadena a copiar porque a partir de hoy, el método para hacerlo a través del escritorio no funcionará para dispositivos móviles. Tengo una función if then para capturar si el método de escritorio funcionó y si no, para disparar el código que funcionará para un dispositivo móvil. Este método no requiere descargas o enlaces necesarios. Ambos métodos resaltan el texto que desea copiar y luego activa el comando copiar a su portapapeles, seguido de la des-selección de la cadena que está tratando de copiar. Puede mezclar el código a su gusto, pero esta es la manera de hacerlo.

 1
Author: MattOlivos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-19 03:25:42