Algunos sitios web ahora usan un servicio de JavaScript de Tynt que agrega texto al contenido copiado.
Si copia texto de un sitio usando esto y luego lo pega, obtendrá un enlace al contenido original en la parte inferior del texto.
Tynt también rastrea esto a medida que sucede. Es un buen truco bien hecho.
Su secuencia de comandos para hacer esto es impresionante: en lugar de intentar manipular el portapapeles (que solo las versiones anteriores de IE les permiten hacer de forma predeterminada y que siempre deben estar apagadas), manipulan la selección real.
Por lo tanto, cuando selecciona un bloque de texto, el contenido adicional se agrega como oculto. <div>
incluido en su selección. Cuando pega, el estilo adicional se ignora y aparece el enlace adicional.
En realidad, esto es bastante fácil de hacer con bloques de texto simples, pero una pesadilla cuando se consideran todas las selecciones posibles en HTML complejo en diferentes navegadores.
Estoy desarrollando una aplicación web: no quiero que nadie pueda rastrear el contenido copiado y me gustaría que la información adicional contenga algo contextual, en lugar de solo un enlace. El servicio de Tynt no es realmente apropiado en este caso.
¿Alguien sabe de una biblioteca de JavaScript de código abierto (tal vez un complemento jQuery o similar) que proporcione una funcionalidad similar pero que no exponga los datos internos de la aplicación?
fuente
Respuestas:
Actualización 2020
Solución que funciona en todos los navegadores recientes .
[Entrada anterior - antes de la actualización de 2020]
Hay dos formas principales de agregar información adicional al texto web copiado.
1. Manipulación de la selección
La idea es buscar el
copy event
, luego agregar un contenedor oculto con nuestra información adicional aldom
, y extender la selección al mismo.Este método está adaptado de este artículo por c.bavota . Consulte también la versión de jitbit para casos más complejos.
2. Manipular el portapapeles
La idea es observar
copy event
y modificar directamente los datos del portapapeles. Esto es posible usando laclipboardData
propiedad. Tenga en cuenta que esta propiedad está disponible en todos los navegadores principales enread-only
; elsetData
método solo está disponible en IE.fuente
window.clipboardData
aevent.clipboardData
. IE (v11 también) no es compatible conevent.clipboardData
jsfiddle.net/m56af0je/8Esta es una solución javascript de vainilla de una solución modificada anterior, pero es compatible con más navegadores (método de navegador cruzado)
fuente
La versión más corta de jQuery que probé y está funcionando es:
fuente
Aquí hay un complemento en jquery para hacer eso https://github.com/niklasvh/jquery.plugin.clipboard Del proyecto readme "Este script modifica el contenido de una selección antes de que se llame a un evento de copia, lo que da como resultado la selección copiada ser diferente de lo que seleccionó el usuario.
Esto le permite agregar / anteponer contenido a la selección, como información de derechos de autor u otro contenido.
Publicado bajo licencia MIT "
fuente
Mejorando la respuesta, restaure la selección después de las alteraciones para evitar selecciones aleatorias después de la copia.
fuente
var range = selection.getRangeAt(0);
Mejora para 2018
fuente
var selection = window.getSelection();
por esta:var selection = getSelectionHtml();
También una solución un poco más corta:
fuente
Es una compilación de las 2 respuestas anteriores + compatibilidad con Microsoft Edge.
También agregué una restauración de la selección original al final, como se espera de forma predeterminada en cualquier navegador.
fuente