¿Por qué document.execCommand (“pegar”) no funciona en Google Chrome?

Tengo un problema con mi extensión. Quiero pegar datos desde el portapapeles.

Hasta ahora, tengo esto:

function pasteAndGo() { document.execCommand('paste') alert("Pasted") } 

Aparece la alerta, pero nada ha sido pegado.

Tengo la sensación de que es la parte del document que necesita cambiar, pero no sé qué hacer. ¿Algunas ideas?

No puede ejecutarlo en una página normal, solo en una página de fondo.

Solía ​​haber una API experimental del portapapeles en Chrome, pero se eliminó en Chrome 13.

Chrome se ha movido hacia los comandos más estándar document.execCommand('paste') , document.execCommand('copy') y document.execCommand('cut') : https://developer.mozilla.org/en/Rich-Text_Editing_in_Mozilla # Ejecutando% 5FCommands

En Chrome necesitarás que los permisos se agreguen a tu manifiesto: “clipboardRead” y “clipboardWrite”. http://developer.chrome.com/extensions/declare_permissions.html

Hasta Chrome 38, estos permisos del portapapeles solo estaban disponibles para páginas de extensión, como los scripts de fondo. A partir de Chrome 39, los scripts de contenido también pueden usar estas API del portapapeles después de declarar los permisos del portapapeles en el archivo de manifiesto ( crbug.com/395376 ).

Esto funciona bien para mí en una página de fondo.

 function getClipboard() { var pasteTarget = document.createElement("div"); pasteTarget.contentEditable = true; var actElem = document.activeElement.appendChild(pasteTarget).parentNode; pasteTarget.focus(); document.execCommand("Paste", null, null); var paste = pasteTarget.innerText; actElem.removeChild(pasteTarget); return paste; }; 

Por supuesto, su extensión aún necesita el permiso “clipboardRead” y usted tiene que usar el paso de mensajes para obtener esta información en su script de contenido:

content.js:

 chrome.extension.sendMessage({ cmd: "clipboard", //$NON-NLS-0$ action: "paste" //$NON-NLS-0$ }, function(response) { if (response.paste) { var range = document.getSelection().getRangeAt(0); range.deleteContents(); range.insertNode(document.createTextNode(response.paste)); } }); 

background.js:

 function getClipboard() { var pasteTarget = document.createElement("div"); pasteTarget.contentEditable = true; var actElem = document.activeElement.appendChild(pasteTarget).parentNode; pasteTarget.focus(); document.execCommand("Paste", null, null); var paste = pasteTarget.innerText; actElem.removeChild(pasteTarget); return paste; }; function onClipboardMessage(request, sender, sendResponse) { if (request.action === "paste") { //$NON-NLS-0$ sendResponse({ paste: getClipboard() }); } } chrome.extension.onMessage.addListener(onClipboardMessage); 

La llamada document.execCommand("paste") no es compatible con los navegadores “razonables”, debido a problemas de seguridad, ya que podría permitir que el script lea datos confidenciales (como contraseñas) del portapapeles.

Esta es la matriz de compatibilidad de document.execCommand("...") respecto a los eventos del portapapeles:

  | "copy" | "paste" | "cut" --------+--------+---------+-------- IE | OK | OK | n/a --------+--------+---------+-------- Edge | OK | n/a | OK --------+--------+---------+-------- Firefox | OK | n/a | OK --------+--------+---------+-------- Chrome | OK | n/a | OK 

Mis dos centavos a esto:

  • El comportamiento de Edge , Firefox y Chrome es “razonable”, ya que impiden pegar / leer datos del portapapeles. Permiten cortar, ya que cortar es simplemente una copia seguida de una eliminación.
  • El comportamiento de IE no tiene sentido para mí, ya que permite el pegado “arriesgado”, pero no ejecuta el evento de corte.

Puede detectar los posibles comandos utilizando el método document.queryCommandSupported .

execCommand('copy') permiso execCommand('copy') para usar document.execCommand('paste') y el permiso clipboardWrite para usar execCommand('copy') y execCommand('cut') .
De lo contrario, los permisos serán denegados y nada ocurrirá.

Revisa este enlace para más detalles.

necesitas un control en focos que sea capaz de recibir el contenido …

Para ver algunos ejemplos sobre el portapapeles en JS, consulte http://www.geekpedia.com/tutorial126_Clipboard-cut-copy-and-paste-with-JavaScript.html
y http://help.dottoro.com/ljcvtcaw.php

Con respecto a las extensiones de Chrome, vea Copiar / Pegar que no funciona en la extensión de Chrome