El Atributo ONPASTE

El atributo onpaste se activa cuando el usuario pega contenido en un elemento editable.

El atributo onpaste se activa cuando el usuario pega contenido en un elemento editable. Es útil para:

  • Validar contenido pegado

  • Formatear texto automáticamente

  • Sanitizar entrada de datos

  • Limitar tipos de contenido

Sintaxis Básica

HTML:

<elemento onpaste="funcion(event)">

JavaScript:

elemento.addEventListener('paste', (event) => {
    // Lógica de manejo
});

Ejemplos Clave

Ejemplo 1: Validación de Texto Plano

JavaScript:

function validarPegado(event) {
    const texto = event.clipboardData.getData('text/plain');
    if(texto.includes('<')) { // Detectar HTML
        event.preventDefault();
        mostrarError();
    }
}

Ejemplo 2: Conversión a Mayúsculas

JavaScript:

event.preventDefault();
const texto = event.clipboardData.getData('text/plain');
document.execCommand('insertText', false, texto.toUpperCase());

Ejemplo 3: Filtro Numérico

JavaScript:

if(!/^d+$/.test(texto)) {
    event.preventDefault();
    mostrarError('Solo números permitidos');
}

Ejemplo 4: Sanitización de HTML

JavaScript:

const sanitizado = texto.replace(/<[^>]*>/g, ''); // Eliminar etiquetas HTML
document.execCommand('insertHTML', false, sanitizado);

Buenas Prácticas

Acceso al Portapapeles:

JavaScript:

const datos = (event.clipboardData || window.clipboardData).getData('text/plain');

Prevención de Acciones:

JavaScript:

event.preventDefault(); // Detener comportamiento predeterminado

Métodos de Inserción:

  • insertText: Para texto plano

  • insertHTML: Para contenido formateado (con precaución)

Seguridad:

// Eliminar posibles XSS
.replace(/<script.*?</script>/gi, '')

Compatibilidad

Navegador Soporte
Chrome ✅ 1+
Firefox ✅ 22+
Safari ✅ 3+
Edge ✅ 12+

Casos de Uso Avanzados

  • Editores WYSIWYG: Limpiar formato al pegar

  • Campos de código: Resaltar sintaxis automáticamente

  • Sistemas de traducción: Traducir texto al pegar

  • Inputs especializados: Formatear números telefónicos

Conclusión

El atributo onpaste permite:

  • Mejorar la seguridad de las entradas

  • Mantener consistencia en los datos

  • Implementar funcionalidades avanzadas

  • Mejorar la experiencia del usuario

Consejos finales:

  • Siempre validar en el servidor también

  • Usar execCommand para manipulación precisa

  • Probar en diferentes navegadores

  • Considerar accesibilidad (mensajes claros)

HTML:

<!-- Ejemplo Final: Pegado inteligente en tablas -->
<table contenteditable onpaste="manejarPegadoTabla(event)">
    <!-- Filas y celdas -->
</table>

<script>
function manejarPegadoTabla(event) {
    event.preventDefault();
    const texto = event.clipboardData.getData('text/plain');
    const filas = texto.split('
').map(fila => fila.split('	'));
    // Lógica para insertar en tabla
}
</script>

Este tutorial te proporciona las bases para controlar eficientemente el pegado de contenido en tus aplicaciones web. ¡Experimenta y crea entradas más seguras y funcionales!

HTML:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Tutorial: Uso del atributo onpaste</title>
    <style>
        .demo-container {
            border: 2px solid #3498db;
            padding: 20px;
            margin: 20px;
            border-radius: 8px;
        }
        .input-control {
            margin: 10px 0;
            padding: 8px;
            width: 300px;
        }
        .error-message {
            color: #e74c3c;
            display: none;
        }
        #richEditor {
            border: 1px solid #7f8c8d;
            padding: 15px;
            min-height: 100px;
            margin: 10px 0;
        }
    </style>
</head>
<body>
    <h1>Tutorial del atributo <code>onpaste</code></h1>

    <!-- Ejemplo 1: Validación básica -->
    <div class="demo-container">
        <h2>1. Validación de texto pegado</h2>
        <input type="text" class="input-control"
               onpaste="validarPegado(event)"
               placeholder="Pega solo texto aquí">
        <p class="error-message" id="error1">¡Solo se permite texto sin formato!</p>
    </div>

    <!-- Ejemplo 2: Formateo automático -->
    <div class="demo-container">
        <h2>2. Formateo de mayúsculas</h2>
        <input type="text" class="input-control"
               onpaste="formatearMayusculas(event)"
               placeholder="El texto se convertirá a mayúsculas">
    </div>

    <!-- Ejemplo 3: Filtro numérico -->
    <div class="demo-container">
        <h2>3. Campo numérico</h2>
        <input type="text" class="input-control"
               onpaste="filtrarNumeros(event)"
               placeholder="Solo números permitidos">
        <p class="error-message" id="error2">¡Solo se permiten números!</p>
    </div>

    <!-- Ejemplo 4: Editor enriquecido -->
    <div class="demo-container">
        <h2>4. Control de contenido pegado</h2>
        <div id="richEditor" contenteditable="true"
             onpaste="sanitizarPegado(event)"></div>
        <p class="error-message" id="error3">¡Contenido no permitido detectado!</p>
    </div>

    <script>
        // Ejemplo 1: Validación de texto plano
        function validarPegado(event) {
            const textoPegado = (event.clipboardData || window.clipboardData)
                .getData('text/plain');
            
            if(textoPegado.match(/<[^>]*>/) || textoPegado.includes(' ')) {
                event.preventDefault();
                document.getElementById('error1').style.display = 'block';
                setTimeout(() => {
                    document.getElementById('error1').style.display = 'none';
                }, 2000);
            }
        }

        // Ejemplo 2: Convertir a mayúsculas
        function formatearMayusculas(event) {
            event.preventDefault();
            const texto = event.clipboardData.getData('text/plain');
            const textoFormateado = texto.toUpperCase();
            document.execCommand('insertText', false, textoFormateado);
        }

        // Ejemplo 3: Filtro numérico
        function filtrarNumeros(event) {
            const texto = event.clipboardData.getData('text/plain');
            if(!/^d+$/.test(texto)) {
                event.preventDefault();
                document.getElementById('error2').style.display = 'block';
                setTimeout(() => {
                    document.getElementById('error2').style.display = 'none';
                }, 1500);
            }
        }

        // Ejemplo 4: Sanitización de contenido
        function sanitizarPegado(event) {
            event.preventDefault();
            const texto = event.clipboardData.getData('text/plain');
            const sanitizado = texto
                .replace(/<script.*?</script>/gi, '')
                .replace(/<style.*?</style>/gi, '')
                .replace(/</?[^>]+(>|$)/g, '')
                .substring(0, 500); // Limitar longitud
            
            if(texto.length !== sanitizado.length) {
                document.getElementById('error3').style.display = 'block';
                setTimeout(() => {
                    document.getElementById('error3').style.display = 'none';
                }, 2000);
            }
            
            document.execCommand('insertHTML', false, sanitizado);
        }
    </script>
</body>
</html>