Introducción

La optimización de contenido es crucial para los servicios SEO en Mallorca. Esta técnica garantiza que el contenido de un sitio web esté bien estructurado, sea relevante y esté orientado a los motores de búsqueda. En este artículo, exploraremos los pilares fundamentales de la optimización de contenido y su importancia en el contexto de los servicios SEO en Mallorca.

Investigación de palabras clave

El primer paso para optimizar el contenido de un sitio web es realizar una investigación exhaustiva de palabras clave relevantes para los servicios SEO en Mallorca. Estas palabras clave deben ser seleccionadas cuidadosamente mediante el análisis de la demanda y la competencia en el mercado local de Mallorca.

Es recomendable utilizar herramientas especializadas para encontrar palabras clave relevantes y de alto volumen de búsqueda. Estas herramientas proporcionarán información valiosa sobre las palabras clave más populares en el nicho de los servicios SEO en Mallorca. Una vez que se identifican las palabras clave, se deben incorporar de manera estratégica en el contenido del sitio web.

Creación de contenido de calidad

El contenido de calidad es uno de los pilares fundamentales de la optimización de contenido para los servicios SEO en Mallorca. El contenido debe ser relevante, informativo y único para captar la atención de los usuarios y los motores de búsqueda.

Es esencial escribir contenido original y evitar el uso de contenido duplicado. Los motores de búsqueda penalizan los sitios web que copian contenido de otras fuentes. Además, el contenido debe estar bien estructurado y organizado en párrafos y secciones utilizando etiquetas .

Uso adecuado de etiquetas de encabezado

Utilizar correctamente las etiquetas de encabezado

y

es esencial para la optimización de contenido. Estas etiquetas ayudan a los motores de búsqueda a comprender la estructura y la jerarquía del contenido del sitio web.

Los encabezados principales deben estar etiquetados con

, mientras que los subencabezados deben utilizar

. Esto ayuda a organizar el contenido de manera clara y facilita la navegación para los usuarios. Además, los motores de búsqueda valoran positivamente una estructura de encabezados adecuada.

Optimización de metaetiquetas

Las metaetiquetas son elementos HTML que proporcionan información sobre el contenido de una página web a los motores de búsqueda. Estas etiquetas incluyen el título de la página (etiqueta ) y la descripción (etiqueta <meta description>).</p><p>Es imprescindible optimizar estas metaetiquetas para los servicios SEO en Mallorca. El título de la página debe contener las palabras clave principales y ser atractivo para los usuarios. La descripción debe ser concisa y atractiva, ya que se muestra en los resultados de búsqueda.</p><h2>Optimización de imágenes</h2>Las imágenes también deben ser optimizadas para mejorar el posicionamiento en los motores de búsqueda. Cada imagen debe tener un texto alternativo (atributo alt) que describa su contenido. Además, los nombres de archivo de las imágenes deben ser descriptivos y contener palabras clave relevantes.</p><p>Es recomendable comprimir las imágenes para mejorar el tiempo de carga del sitio web y garantizar una mejor experiencia de usuario. Las imágenes pesadas pueden ralentizar la carga de la página, lo que puede ser perjudicial para el posicionamiento y la usabilidad del sitio.</p><h2>Vinculación interna y externa</h2>La vinculación tanto interna como externa es esencial para la optimización de contenido en los servicios SEO en Mallorca. La vinculación interna se refiere a la inclusión de enlaces en el contenido del sitio web que dirigen a otras páginas del mismo dominio.</p><p>La vinculación externa implica la inclusión de enlaces a sitios web externos y de referencia en el contenido. Ambos tipos de vinculación ayudan a mejorar la navegación, el flujo de tráfico y el posicionamiento en los motores de búsqueda.<ul><li>La vinculación interna ayuda a aumentar la relevancia y la autoridad de las páginas internas del sitio.</li><li>La vinculación externa proporciona referencias a fuentes confiables y de calidad, lo que también puede mejorar la autoridad del propio sitio web.</li></ul><h2>Optimización para dispositivos móviles</h2>En la era actual, la optimización para dispositivos móviles es un aspecto crucial de los servicios SEO en Mallorca. Cada vez más usuarios acceden a los sitios web a través de sus dispositivos móviles, por lo que es imprescindible garantizar una experiencia de usuario óptima en estos dispositivos.</p><p>Es esencial utilizar un diseño responsive que se adapte automáticamente al tamaño de pantalla del dispositivo. Además, los tiempos de carga deben ser rápidos y el contenido debe ser fácil de leer y navegar en pantallas más pequeñas.</p><h2>Análisis y seguimiento</h2>El análisis y seguimiento del rendimiento del contenido es esencial para los servicios SEO en Mallorca. Las herramientas de análisis permiten realizar un seguimiento del tráfico, las palabras clave más populares, las páginas con mejor rendimiento y otros datos valiosos.</p><p>Este análisis ayuda a identificar áreas de mejora y a ajustar la estrategia de optimización de contenido en consecuencia. Mantenerse al tanto de las últimas tendencias y cambios en los algoritmos de los motores de búsqueda también es fundamental para mantener un contenido optimizado y relevante.</p><h2>Conclusiones</h2>La optimización de contenido es esencial para los servicios SEO en Mallorca. Los pilares fundamentales de esta técnica incluyen una investigación sólida de palabras clave, la creación de contenido de calidad, el uso adecuado de etiquetas de encabezado, la optimización de metaetiquetas, la optimización de imágenes, la vinculación interna y externa, la adaptación para dispositivos móviles, y el análisis y seguimiento del rendimiento.</p><p>Al aplicar estos pilares, los propietarios de sitios web podrán mejorar su posicionamiento en los motores de búsqueda y atraer más tráfico y clientes potenciales a sus servicios SEO en Mallorca.</p> </div> </div> </section> </article> <!-- CTA intermedio --> <section class="section cta-section"> <div class="container"> <div class="cta-content fade-up"> <span class="section-label">¿Necesitas ayuda?</span> <h2>¿Te interesa implementar algo así?</h2> <p>Cuéntanos tu proyecto y te asesoramos sin compromiso.</p> <div class="hero-buttons hero-buttons-center"> <a href="/contacto/" class="btn btn-accent btn-lg"> Solicitar asesoramiento <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg> </a> </div> </div> </div> </section> <!-- Schema.org: Article + Breadcrumbs --> <script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","headline":"Los pilares fundamentales de la optimización de contenido para servicios SEO en Mallorca","datePublished":"2023-10-26","dateModified":"2023-10-26","author":{"@type":"Organization","name":"SINT"},"publisher":{"@type":"Organization","name":"SINT","logo":{"@type":"ImageObject","url":"https://sint.es/assets/img/logo.png"}},"description":"La optimización de contenido es crucial para los servicios SEO en Mallorca. Esta técnica garantiza que el contenido de un sitio web esté bien estructurado, sea relevante y esté orientado a los motores de búsqueda. En...","mainEntityOfPage":{"@type":"WebPage","@id":"https://sint.es/blog/los-pilares-fundamentales-de-la-optimizacion-de-contenido-para-servicios-seo-en-mallorca/"},"image":"https://sint.es/assets/img/blog/los-pilares-fundamentales-de-la-optimizacion-de-contenido-para-servicios-seo-en-mallorca.jpg"}</script><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Inicio","item":"https://sint.es/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://sint.es/blog/"},{"@type":"ListItem","position":3,"name":"Los pilares fundamentales de la optimización de contenido para servicios SEO en Mallorca","item":"https://sint.es/blog/los-pilares-fundamentales-de-la-optimizacion-de-contenido-para-servicios-seo-en-mallorca/"}]}</script> <!-- POSTS RELACIONADOS --> <section class="section"> <div class="container"> <div class="section-header fade-up"> <span class="section-label">Sigue leyendo</span> <h2>Posts relacionados</h2> </div> <div class="solutions-grid"> <article class="solution-card fade-up"> <img src="/assets/img/blog/como-utilizar-palabras-clave-en-la-optimizacion-de-contenido-para-servicios-seo-en-mallorca.jpg" alt="Cómo utilizar palabras clave en la optimización de contenido para servicios SEO en Mallorca" class="solution-card-img blog-card-img" loading="lazy" decoding="async"> <div class="solution-card-body"> <span class="solution-badge mb-sm">Optimización de contenido</span> <h3>Cómo utilizar palabras clave en la optimización de contenido para servicios SEO en Mallorca</h3> <p>En el mundo del SEO, una de las estrategias más importantes para mejorar la visibilidad de un sitio web en los motores de búsqueda es la optimizaci...</p> <div class="blog-card-meta"> <span class="blog-card-date">2023-10-26</span> <a href="/blog/como-utilizar-palabras-clave-en-la-optimizacion-de-contenido-para-servicios-seo-en-mallorca/" class="solution-card-link"> Leer <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg> </a> </div> </div> </article> <article class="solution-card fade-up"> <img src="/assets/img/blog/la-importancia-de-la-optimizacion-de-contenido-en-el-posicionamiento-organico-de-mallorca.jpg" alt="La importancia de la optimización de contenido en el posicionamiento orgánico de Mallorca" class="solution-card-img blog-card-img" loading="lazy" decoding="async"> <div class="solution-card-body"> <span class="solution-badge mb-sm">Optimización de contenido</span> <h3>La importancia de la optimización de contenido en el posicionamiento orgánico de Mallorca</h3> <p>Mallorca es uno de los destinos turísticos más populares del mundo. Con sus playas de ensueño, su clima mediterráneo y su rica cultura, esta isla a...</p> <div class="blog-card-meta"> <span class="blog-card-date">2023-10-26</span> <a href="/blog/la-importancia-de-la-optimizacion-de-contenido-en-el-posicionamiento-organico-de-mallorca/" class="solution-card-link"> Leer <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg> </a> </div> </div> </article> <article class="solution-card fade-up"> <img src="/assets/img/blog/optimizacion-de-contenido-clave-para-destacar-en-los-buscadores-de-mallorca.jpg" alt="Optimización de contenido: clave para destacar en los buscadores de Mallorca" class="solution-card-img blog-card-img" loading="lazy" decoding="async"> <div class="solution-card-body"> <span class="solution-badge mb-sm">Optimización de contenido</span> <h3>Optimización de contenido: clave para destacar en los buscadores de Mallorca</h3> <p>La optimización de contenido es una estrategia fundamental para cualquier empresa o negocio que desee destacar en los resultados de búsqueda de los...</p> <div class="blog-card-meta"> <span class="blog-card-date">2023-10-26</span> <a href="/blog/optimizacion-de-contenido-clave-para-destacar-en-los-buscadores-de-mallorca/" class="solution-card-link"> Leer <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg> </a> </div> </div> </article> </div> </div> </section> <!-- NAVEGACIÓN --> <section class="section cta-section"> <div class="container"> <div class="cta-content fade-up"> <div class="hero-buttons hero-buttons-center"> <a href="/blog/" class="btn btn-outline btn-lg"> <svg class="class="flip-h"" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg> Volver al blog </a> <a href="/contacto/" class="btn btn-accent btn-lg"> Contactar <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg> </a> </div> </div> </div> </section> </main> <!-- FOOTER --> <footer class="site-footer"> <div class="container"> <div class="footer-grid"> <!-- Columna marca --> <div class="footer-brand"> <a href="/" class="footer-logo"> <img src="/assets/img/logo.png" alt="SINT" class="footer-logo-img" loading="lazy" decoding="async"> </a> <p class="footer-tagline">IA para Administración Pública y Empresa</p> <div class="footer-contact-info"> <a href="tel:+34679888971" class="footer-contact-link"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.79 19.79 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.81.36 1.6.68 2.36a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.72-1.27a2 2 0 0 1 2.11-.45c.76.32 1.55.55 2.36.68A2 2 0 0 1 22 16.92z"/></svg> +34 679 888 971 </a> <a href="mailto:miquel@sint.es" class="footer-contact-link"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="4" width="20" height="16" rx="2"/><polyline points="22 7 12 13 2 7"/></svg> miquel@sint.es </a> <span class="footer-contact-link"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg> Calle des Bartoli, 22 — 07579 Artà, Illes Balears </span> </div> <div class="footer-social"> <a href="https://linkedin.com/company/sint-es" target="_blank" rel="noopener" aria-label="LinkedIn"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-4 0v7h-4v-7a6 6 0 0 1 6-6z"/><rect x="2" y="9" width="4" height="12"/><circle cx="4" cy="4" r="2"/></svg></a> <a href="https://twitter.com/sint_es" target="_blank" rel="noopener" aria-label="Twitter"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z"/></svg></a> </div> </div> <!-- Columnas de enlaces --> <div class="footer-col"> <h4 class="footer-col-title">Soluciones IA</h4> <ul class="footer-links"> <li><a href="/soluciones/turismo/">Agente Turismo</a></li> <li><a href="/soluciones/eventos/">Agente Eventos</a></li> <li><a href="/soluciones/tutor/">Agente Tutor</a></li> <li><a href="/soluciones/comercio/">Agente Comercio</a></li> <li><a href="/soluciones/ordenanza/">Agente Ordenanza</a></li> <li><a href="/soluciones/subvenciones/">Agente Subvenciones</a></li> <li><a href="/soluciones/">Todas las soluciones →</a></li> </ul> </div> <div class="footer-col"> <h4 class="footer-col-title">Servicios</h4> <ul class="footer-links"> <li><a href="/servicios/ciberseguridad/">Ciberseguridad NIS2</a></li> <li><a href="/servicios/desarrollo-web/">Desarrollo Web</a></li> <li><a href="/servicios/seo/">SEO</a></li> <li><a href="/servicios/linkbuilding/">Linkbuilding</a></li> <li><a href="/servicios/email-marketing/">Email Marketing</a></li> <li><a href="/servicios/consultoria-ia/">Consultoría IA</a></li> </ul> </div> <div class="footer-col"> <h4 class="footer-col-title">Auditorías</h4> <ul class="footer-links"> <li><a href="/auditorias/">Todas las auditorías</a></li> </ul> </div> <div class="footer-col"> <h4 class="footer-col-title">Empresa</h4> <ul class="footer-links"> <li><a href="/sobre-nosotros/">Sobre nosotros</a></li> <li><a href="/casos-exito/">Casos de éxito</a></li> <li><a href="/blog/">Blog</a></li> <li><a href="/contacto/">Contacto</a></li> <li><a href="/aviso-legal/">Aviso Legal</a></li> </ul> </div> </div> <div class="footer-bottom"> <p>© 2026 SINT — Sistemas Inteligentes y Nuevas Tecnologías, S.L. · CIF B75455246</p> </div> </div> </footer> <!-- CTA Sticky móvil — sólo se muestra fuera de /contacto/ --> <div class="cta-sticky" id="cta-sticky"> <a href="/contacto/" class="btn btn-accent">Solicitar demo</a> </div> <!-- JS: menú móvil, scroll header, animaciones, glow cards --> <script> (function() { var toggle = document.getElementById('nav-toggle'); var menu = document.getElementById('nav-menu'); var header = document.getElementById('site-header'); // Toggle tema claro/oscuro var themeToggle = document.getElementById('theme-toggle'); function setTheme(theme) { document.documentElement.setAttribute('data-theme', theme); localStorage.setItem('sint-theme', theme); } // Cargar preferencia guardada o respetar preferencia del sistema var saved = localStorage.getItem('sint-theme'); if (saved) { setTheme(saved); } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) { setTheme('light'); } if (themeToggle) { themeToggle.addEventListener('click', function() { var current = document.documentElement.getAttribute('data-theme'); setTheme(current === 'light' ? 'dark' : 'light'); }); } // Toggle menú móvil if (toggle && menu) { toggle.addEventListener('click', function() { var open = menu.classList.toggle('open'); toggle.classList.toggle('open'); toggle.setAttribute('aria-expanded', open ? 'true' : 'false'); if (open) { // Focus trap: primer enlace del menú var firstLink = menu.querySelector('.nav-link'); if (firstLink) firstLink.focus(); } }); // Cerrar menú con Escape document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && menu.classList.contains('open')) { menu.classList.remove('open'); toggle.classList.remove('open'); toggle.setAttribute('aria-expanded', 'false'); toggle.focus(); } }); // Focus trap dentro del menú móvil menu.addEventListener('keydown', function(e) { if (e.key !== 'Tab' || !menu.classList.contains('open')) return; var focusable = menu.querySelectorAll('a, button'); if (!focusable.length) return; var first = focusable[0]; var last = focusable[focusable.length - 1]; if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); } else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); } }); } // Header con fondo al hacer scroll var ticking = false; window.addEventListener('scroll', function() { if (!ticking) { requestAnimationFrame(function() { var st = window.pageYOffset || document.documentElement.scrollTop; if (st > 50) { header.classList.add('scrolled'); } else { header.classList.remove('scrolled'); } ticking = false; }); ticking = true; } }, { passive: true }); // Animación de entrada al scroll (IntersectionObserver) if ('IntersectionObserver' in window) { var observer = new IntersectionObserver(function(entries) { entries.forEach(function(entry) { if (entry.isIntersecting) { entry.target.classList.add('visible'); observer.unobserve(entry.target); } }); }, { threshold: 0.08, rootMargin: '0px 0px -60px 0px' }); document.querySelectorAll('.fade-up').forEach(function(el) { observer.observe(el); }); } // Efecto glow en tarjetas al mover el cursor (con throttle vía rAF) var cards = document.querySelectorAll('.service-card, .reason-item, .solution-card, .testimonial-card, .feature-card'); cards.forEach(function(card) { var glowTicking = false; card.addEventListener('mousemove', function(e) { if (!glowTicking) { var cx = e.clientX; var cy = e.clientY; requestAnimationFrame(function() { var rect = card.getBoundingClientRect(); card.style.setProperty('--mouse-x', (cx - rect.left) + 'px'); card.style.setProperty('--mouse-y', (cy - rect.top) + 'px'); glowTicking = false; }); glowTicking = true; } }, { passive: true }); }); // Cerrar menú móvil al hacer clic en un enlace if (menu) { menu.querySelectorAll('.nav-link').forEach(function(link) { link.addEventListener('click', function() { if (window.innerWidth <= 900) { menu.classList.remove('open'); toggle.classList.remove('open'); } }); }); } // --- CTA Sticky móvil --- // Muestra barra fija cuando el usuario pasa el hero; la oculta cerca del footer var ctaSticky = document.getElementById('cta-sticky'); var heroSection = document.querySelector('.hero'); if (ctaSticky && heroSection && 'IntersectionObserver' in window) { var heroObs = new IntersectionObserver(function(entries) { entries.forEach(function(entry) { // Si el hero NO es visible y no estamos cerca del fondo var nearBottom = (window.innerHeight + window.pageYOffset) >= (document.body.scrollHeight - 200); if (!entry.isIntersecting && !nearBottom) { ctaSticky.classList.add('visible'); } else { ctaSticky.classList.remove('visible'); } }); }, { threshold: 0 }); heroObs.observe(heroSection); // Ocultar cuando el usuario está cerca del footer (200px del fondo) — con throttle var ctaTicking = false; window.addEventListener('scroll', function() { if (!ctaTicking && ctaSticky.classList.contains('visible')) { requestAnimationFrame(function() { var nearBottom = (window.innerHeight + window.pageYOffset) >= (document.body.scrollHeight - 200); if (nearBottom) { ctaSticky.classList.remove('visible'); } ctaTicking = false; }); ctaTicking = true; } }, { passive: true }); } // --- Validación de formularios y estado de carga --- var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; // Validar un campo: vacío o formato email function validarCampo(input) { var valor = input.value.trim(); var invalido = false; if (input.hasAttribute('required') && valor === '') { invalido = true; } else if (input.type === 'email' && valor !== '' && !emailRegex.test(valor)) { invalido = true; } if (invalido) { input.classList.add('invalid'); input.setAttribute('aria-invalid', 'true'); } else { input.classList.remove('invalid'); input.removeAttribute('aria-invalid'); } return !invalido; } // Aplicar validación on blur a todos los formularios de contacto var formularios = document.querySelectorAll('.contact-form, .cta-form'); formularios.forEach(function(form) { // Validar campos nombre y email al perder el foco var campos = form.querySelectorAll('input[name="nombre"], input[name="email"]'); campos.forEach(function(campo) { campo.addEventListener('blur', function() { validarCampo(campo); }); // Quitar estado inválido al escribir campo.addEventListener('input', function() { if (campo.classList.contains('invalid')) { validarCampo(campo); } }); }); // Estado de carga al enviar form.addEventListener('submit', function(e) { // Validar campos requeridos antes de enviar var todosValidos = true; campos.forEach(function(campo) { if (!validarCampo(campo)) { todosValidos = false; } }); if (!todosValidos) { e.preventDefault(); return; } var btnSubmit = form.querySelector('button[type="submit"]'); if (btnSubmit && !btnSubmit.classList.contains('loading')) { var textoOriginal = btnSubmit.innerHTML; btnSubmit.classList.add('loading'); btnSubmit.disabled = true; btnSubmit.textContent = 'Enviando...'; // Red de seguridad: rehabilitar tras 5 segundos setTimeout(function() { btnSubmit.classList.remove('loading'); btnSubmit.disabled = false; btnSubmit.innerHTML = textoOriginal; }, 5000); } }); }); })(); </script> </body> </html>