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:
- Modificar el portapapeles requiere
e.preventDefault()
. - Nunca confíes solo en el cliente para proteger datos críticos.
- Respeta la experiencia del usuario – evita bloqueos agresivos.
¡Ahora puedes controlar y mejorar la interacción de copia en tus proyectos web!