
- Final · Prioridad: 1 · Condición: todo el sitio. * * Consentimiento (ConsentMagic + modo de consentimiento de Google): * - Se toma como señal de consentimiento de analítica que exista la cookie _ga, * que Google Analytics solo crea cuando el usuario la acepta. * - Sin consentimiento: no se guarda nada en el navegador. Solo se usan los datos * de la página en la que está el formulario (UTMs de la URL y referrer). * - Con consentimiento: se guarda en sessionStorage la entrada de la visita * (página, referrer y UTMs) para no perderla al navegar, y se añade el ID de GA4. * - El formulario se envía siempre, aunque falte algún dato. */ (function () { var KEY = 'sg_attr_v1'; var IDS = ['utm_source', 'utm_medium', 'utm_campaign', 'entry_referrer', 'landing_page', 'ga_client_id']; function cookie(name) { var m = document.cookie.match('(?:^|; )' + name + '=([^;]*)'); return m ? decodeURIComponent(m[1]) : ''; } // _ga tiene la forma GA1.1.1234567890.1729100000: el ID de cliente son los dos últimos bloques. function gaClientId() { var p = cookie('_ga').split('.'); return p.length >= 4 ? p[p.length - 2] + '.' + p[p.length - 1] : ''; } function hayConsentimiento() { return cookie('_ga') !== ''; } // Referrer solo si viene de fuera de la web. Las páginas internas no cuentan como origen. function referrerExterno() { var r = document.referrer; if (!r) return ''; try { return new URL(r).hostname === location.hostname ? '' : r; } catch (e) { return ''; } } function datosDeEstaPagina() { var q = new URLSearchParams(location.search); var ref = document.referrer; var interno = false; try { var u = new URL(ref); // Navegación interna: otra página de la web. Si es la misma página (recarga del banner), no cuenta. interno = !!ref && u.hostname === location.hostname && u.pathname !== location.pathname; } catch (e) {} return { utm_source: q.get('utm_source') || '', utm_medium: q.get('utm_medium') || '', utm_campaign: q.get('utm_campaign') || '', entry_referrer: referrerExterno(), // Si se llega desde otra página de la web y no hay consentimiento, la entrada real no se conoce. landing_page: interno ? 'sin dato (navegación interna sin consentimiento)' : location.pathname }; } function leerGuardado() { try { return JSON.parse(sessionStorage.getItem(KEY) || 'null'); } catch (e) { return null; } } function guardar(d) { try { sessionStorage.setItem(KEY, JSON.stringify(d)); } catch (e) {} } function datos() { var actual = datosDeEstaPagina(); if (!hayConsentimiento()) return actual; var g = leerGuardado(); if (!g) { // Primera página con consentimiento: es la entrada de la visita. g = actual; if (g.landing_page.indexOf('sin dato') === 0) g.landing_page = location.pathname; guardar(g); } else if (actual.utm_source) { // Si llega una campaña nueva en mitad de la visita, se actualizan solo las UTMs. g.utm_source = actual.utm_source; g.utm_medium = actual.utm_medium; g.utm_campaign = actual.utm_campaign; guardar(g); } return g; } function rellenar(raiz) { var d = datos(); d.ga_client_id = gaClientId(); var formularios = (raiz || document).querySelectorAll('form.elementor-form'); for (var i = 0; i < formularios.length; i++) { for (var j = 0; j < IDS.length; j++) { var campo = formularios[i].querySelector('[name="form_fields[' + IDS[j] + ']"]'); if (campo) campo.value = d[IDS[j]] || ''; } } } // Al cargar la página. if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', function () { rellenar(); }); } else { rellenar(); } // Justo antes de enviar (fase de captura, antes que Elementor), por si el usuario // ha aceptado las cookies después de cargar la página. document.addEventListener('submit', function (e) { if (e.target && e.target.classList && e.target.classList.contains('elementor-form')) { rellenar(e.target.parentNode || document); } }, true); // Al entrar en un formulario (clic o tabulador en cualquier campo) y a los 3 segundos de cargar. document.addEventListener('focusin', function (e) { var f = e.target && e.target.closest ? e.target.closest('form.elementor-form') : null; if (f) rellenar(f.parentNode || document); }); setTimeout(function () { rellenar(); }, 3000); // Formularios dentro de popups de Elementor. if (window.jQuery) { window.jQuery(document).on('elementor/popup/show', function () { rellenar(); }); } })();
Skip to content