El Atributo ONCOPY

Es un evento de JavaScript que se activa cuando el usuario copia contenido de un elemento HTML.

El atributo oncopy es un evento de JavaScript que se activa cuando el usuario copia contenido de un elemento HTML (usando Ctrl + C, clic derecho → "Copiar", o la opción del menú del navegador). Es útil para rastrear acciones del usuario, modificar el contenido copiado o restringir la copia no autorizada.

¿Cómo funciona?

  • Disparador: Se ejecuta al copiar texto desde elementos editables o seleccionables.

  • Acción por defecto: Permite la copia del texto seleccionado.

  • Casos de uso comunes:

    • Mostrar advertencias al copiar contenido protegido.

    • Agregar atribución automática al texto copiado.

    • Registrar actividad de copia para análisis.

Elementos compatibles

Funciona en elementos que permiten selección o edición de texto:

  • <input> (text, password, email, etc.)

  • <textarea>

  • <div contenteditable="true">

  • Elementos con texto seleccionable (párrafos, tablas, etc.).

Sintaxis básica

Como atributo HTML:

<div oncopy="manejarCopia(event)">Texto protegido</div>

Con JavaScript (recomendado):

elemento.addEventListener('copy', function(e) {
  e.preventDefault();
  // Lógica personalizada
});

Ejemplos prácticos

Ejemplo 1: Mostrar alerta al copiar

<p oncopy="alert('¡Este contenido está protegido!')">
  Texto confidencial: 123-456-789
</p>

Ejemplo 2: Agregar atribución al texto copiado

<div id="contenido" oncopy="agregarFuente(event)">
  Contenido interesante que los usuarios podrían copiar.
</div>

<script>
  function agregarFuente(e) {
    const seleccion = window.getSelection().toString();
    e.clipboardData.setData('text/plain', 
      `${seleccion}

Fuente: https://mi-sitio.com`
    );
    e.preventDefault(); // Evita copiar el texto original sin cambios
  }
</script>

Ejemplo 3: Bloquear copia no autorizada

<input 
  type="text" 
  value="No me copies" 
  oncopy="return false" <!-- Bloqueo simple -->
>

<!-- Bloqueo condicional con JavaScript -->
<div id="areaProtegida" contenteditable="true">
  Intenta copiar este texto...
</div>

<script>
  document.getElementById('areaProtegida').addEventListener('copy', (e) => {
    if (!usuarioAutorizado) { // Supongamos que "usuarioAutorizado" es una variable de estado
      e.preventDefault();
      alert('Necesitas permiso para copiar este contenido');
    }
  });
</script>

Diferencias clave entre eventos relacionados

Evento Descripción
oncopy Al copiar texto seleccionado
oncut Al cortar texto (copiar + eliminar)
onpaste Al pegar texto desde el portapapeles

Mejores prácticas

No abuses de las restricciones:

Bloquear la copia completamente suele ser contraproducente. Considera agregar atribución en su lugar.

e.clipboardData.setData('text/plain', `${textoOriginal} - © Mi Sitio`);

Usa CSS para indicar contenido protegido:

CSS:

.no-copiar {
  user-select: none;
  -webkit-user-select: none;
}

HTML:

<div class="no-copiar" oncopy="event.preventDefault()">
  Este texto no se puede copiar ni seleccionar.
</div>

Combina con validación del servidor:

Los datos sensibles nunca deben depender solo de oncopy para protección, ya que puede omitirse fácilmente.

Casos avanzados

Copiar en formato enriquecido (HTML):

elemento.addEventListener('copy', (e) => {
  const seleccion = window.getSelection();
  e.clipboardData.setData('text/html', `<b>${seleccion}</b>`);
  e.preventDefault();
});

Registro de actividad en analytics:

<p oncopy="registrarCopia('sección-importante')">
  Texto que los usuarios copian frecuentemente.
</p>

<script>
  function registrarCopia(seccion) {
    fetch('/api/registrar-copia', {
      method: 'POST',
      body: JSON.stringify({ seccion })
    });
  }
</script>

Errores comunes

<!-- MAL: Bloquear sin dar contexto al usuario -->
<div oncopy="return false"></div> <!-- Frustrante para usuarios legítimos -->

<!-- CONFUSIÓN: Esperar que funcione en todos los navegadores -->
<!-- Algunos navegadores limitan el acceso al clipboardData en eventos -->

<!-- OLVIDAR event.preventDefault() -->
<script>
  elemento.addEventListener('copy', () => {
    console.log('Copiado'); // El texto original igual se copiará
  });
</script>

Compatibilidad

Navegador Soporte Notas
Chrome ✅ Sí (v. 1+)  
Firefox ✅ Sí (v. 1.5+)  
Safari ✅ Sí  
Edge ✅ Sí  
Móviles ✅ Sí (con limitaciones) Algunos dispositivos bloquean modificaciones del portapapeles

Conclusión

El atributo oncopy es útil para:

  • Agregar atribución automática al contenido copiado.
  • Monitorear el comportamiento de los usuarios.
  • Mejorar la seguridad en combinación con otras medidas.

Recuerda:

  1. Modificar el portapapeles requiere e.preventDefault().
  2. Nunca confíes solo en el cliente para proteger datos críticos.
  3. Respeta la experiencia del usuario – evita bloqueos agresivos.

¡Ahora puedes controlar y mejorar la interacción de copia en tus proyectos web!