Saltar al contenido

document.execCommand (‘copiar’) no funciona en Chrome

Solución:

No tengo muy claro lo que realmente sucede aquí …

Parece que hay un desajuste en cuanto a lo que debe usarse entre los value y el textContent propiedades de su área de texto.
Chrome parece usar siempre value, mientras que Firefox usa textContent.

btn.onclick = e => {
  const txt = document.createElement('textarea');
  document.body.appendChild(txt);
  txt.value="from value"; // chrome uses this
  txt.textContent="from textContent"; // FF uses this
  var sel = getSelection();
  var range = document.createRange();
  range.selectNode(txt);
  sel.removeAllRanges();
  sel.addRange(range);
  if(document.execCommand('copy')){
    console.log('copied');
  }
  document.body.removeChild(txt);
}
<button id="btn">Copy!</button>
<textarea>You can paste here

</textarea>

Dado que Chrome no mira el textContent propiedad, Rango # selectNodeContents no seleccionará nada en este navegador …

Sin embargo, puede utilizar Rango # selectNode que debería devolver el mismo resultado en este caso y solucionará el problema.

document.getElementById('btn').addEventListener('click', function(){
  var textarea = document.createElement('textarea');
  textarea.textContent="copied text";
  document.body.appendChild(textarea);

  var selection = document.getSelection();
  var range = document.createRange();
//  range.selectNodeContents(textarea);
  range.selectNode(textarea);
  selection.removeAllRanges();
  selection.addRange(range);

  console.log('copy success', document.execCommand('copy'));
  selection.removeAllRanges();

  document.body.removeChild(textarea);
  
})
<button id="btn">copy</button>
<textarea>You can paste here</textarea>

Para las personas que lean esta pregunta en 2020, si tienen problemas con document.execCommand('copy'), puede intentar utilizar la API del Portapapeles.

Por Mozilla:

Hay dos formas en que las extensiones del navegador pueden interactuar con el portapapeles del sistema: el método Document.execCommand () y la API de portapapeles asincrónica moderna.

También por Mozilla, document.execCommand() ahora está obsoleto:

Esta característica está obsoleta. Aunque todavía puede funcionar en algunos navegadores, se desaconseja su uso ya que podría eliminarse en cualquier momento. Trate de evitar su uso.

Con la API del portapapeles, escribir texto en el portapapeles es particularmente fácil:

const textToCopy = 'Hello there!'
navigator.clipboard.writeText(textToCopy)
  .then(() => { alert(`Copied!`) })
  .catch((error) => { alert(`Copy failed! ${error}`) })

Más información:

Discusión de Mozilla sobre los dos sistemas de portapapeles

Discusión de Google sobre los dos sistemas de portapapeles

Otra buena discusión sobre la API del Portapapeles

Puedo usar

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *