# Cómo bloquear scripts de terceros hasta obtener el consentimiento

> Guía para desarrolladores sobre cómo bloquear scripts de terceros hasta el consentimiento: etiquetas inertes, activación, gestores de etiquetas, embeds y pruebas.

Source: https://cookiesh.eu/es/blog/block-scripts-until-consent  
Published: 2026-08-20

## Key takeaways

- Los scripts no esenciales no deben ejecutarse, instalar cookies ni leer datos del dispositivo hasta que el visitante dé su consentimiento.
- El navegador ignora un script con type text/plain, así que puede activarse más tarde sin recargar la página.
- Los scripts insertados con JavaScript se ejecutan de forma asíncrona por defecto; pon async en false cuando los scripts externos deban ejecutarse en orden.
- Los fragmentos en línea, los iframes, los píxeles, los SDK de npm y las etiquetas del gestor de etiquetas también necesitan bloquearse, no solo las etiquetas script con src.
- Comprueba el bloqueo en un perfil de navegador nuevo revisando las solicitudes de red y el almacenamiento antes de hacer clic en nada.

Para bloquear scripts de terceros hasta obtener el consentimiento, publícalos en un formato que el navegador no ejecute, como una etiqueta `<script>` con `type="text/plain"`, y actívalos solo cuando el visitante acepte la categoría correspondiente. Aplica la misma regla a los fragmentos en línea, los iframes, los píxeles de seguimiento y las etiquetas del gestor de etiquetas, y compruébalo después en un navegador limpio antes de hacer clic en nada.

## ¿Por qué los scripts de terceros tienen que esperar al consentimiento?

Porque la mayoría almacena o lee información en el dispositivo del visitante en cuanto se ejecuta, y en la UE eso requiere consentimiento previo. El artículo 5, apartado 3, de la Directiva ePrivacy exige consentimiento para almacenar información en un dispositivo o acceder a ella, salvo que sea estrictamente necesario para un servicio que el usuario haya solicitado expresamente.

Los scripts de analítica, publicidad, redes sociales y muchos de contenidos incrustados instalan cookies, leen el almacenamiento del navegador o recopilan características del dispositivo en cuanto se ejecutan. En el asunto Planet49 (C-673/17), el Tribunal de Justicia de la UE confirmó que la norma se aplica tanto si la información es un dato personal como si no, y que las casillas premarcadas no constituyen un consentimiento válido. Un banner que aparece cuando los rastreadores ya se están ejecutando no cumple ese estándar.

Los scripts realmente necesarios para el servicio, como los de pago, prevención del fraude o la propia herramienta de consentimiento, pueden cargarse con normalidad; consulta [qué se considera una cookie estrictamente necesaria](/es/blog/strictly-necessary-cookies).

## ¿Cómo bloqueo los scripts antes del consentimiento?

Cambia su `type`. Los navegadores solo descargan y ejecutan los scripts cuyo `type` es un tipo de JavaScript o `module`; un script marcado como `text/plain` se trata como datos inertes. Conserva los atributos originales y añade una categoría para que tu código de consentimiento sepa qué activar.

```html
<!-- Inertes: el navegador no los descarga ni los ejecuta -->
<script type="text/plain" data-consent="analytics"
        src="https://analytics.example.com/script.js"></script>

<script type="text/plain" data-consent="marketing">
  window.adPixel = window.adPixel || [];
  window.adPixel.push(['init', 'PIXEL_ID']);
</script>

<!-- Contenidos incrustados: guarda la URL real en data-src hasta el consentimiento -->
<iframe data-consent="marketing"
        data-src="https://www.youtube-nocookie.com/embed/VIDEO_ID"
        title="Demostración del producto" width="560" height="315"></iframe>
```

Elimina las imágenes de reserva en `<noscript>` que incluyen muchos fragmentos de proveedores. Lanzan una solicitud cuando JavaScript está desactivado, que es justo cuando tu banner no puede aparecer, así que no hay forma de bloquearlas.

## ¿Cómo activo los scripts bloqueados después del consentimiento?

Sustituye cada script inerte por un elemento `<script>` nuevo. Cambiar el atributo `type` de un elemento existente no hace que el navegador lo ejecute, y los scripts añadidos mediante `innerHTML` nunca se ejecutan, así que necesitas un elemento nuevo creado con `document.createElement`.

```js
function activate(category) {
  document
    .querySelectorAll(`script[type="text/plain"][data-consent="${category}"]`)
    .forEach((inert) => {
      const live = document.createElement('script');
      for (const { name, value } of inert.attributes) {
        if (name !== 'type') live.setAttribute(name, value);
      }
      if (!inert.hasAttribute('async')) live.async = false; // mantener el orden de inserción
      live.text = inert.text; // código en línea, si lo hay
      inert.replaceWith(live);
    });

  document
    .querySelectorAll(`iframe[data-consent="${category}"][data-src]`)
    .forEach((frame) => { frame.src = frame.dataset.src; });
}

// Aplica la elección guardada al cargar; vuelve a llamar a activate() desde los controladores de tu banner.
for (const [category, granted] of Object.entries(readStoredConsent())) {
  if (granted) activate(category);
}
```

Hay tres detalles que suelen dar problemas:

- **El orden.** Los scripts externos insertados con JavaScript se ejecutan de forma asíncrona por defecto, en el orden en que terminen de descargarse. Poner `async = false` hace que se ejecuten en el orden de inserción, algo importante cuando una biblioteca depende de otra.
- **Los fragmentos en línea se ejecutan de inmediato.** Un script en línea se ejecuta en cuanto se inserta, sin esperar a los scripts externos. La mayoría de los fragmentos de proveedores ponen sus llamadas en cola hasta que se carga la biblioteca, pero revisa cualquier código propio que dé por hecho que una biblioteca ya está disponible.
- **`document.write()`.** Los fragmentos antiguos que lo llaman no funcionarán una vez cargada la página. Sustitúyelos por el fragmento asíncrono del proveedor.

## ¿Qué método de bloqueo debo usar?

La mayoría de los sitios combinan varios métodos, elegidos según dónde esté cada etiqueta.

| Método | Ideal para | Precauciones |
| --- | --- | --- |
| Etiquetas inertes `text/plain` | Etiquetas incluidas directamente en las plantillas | Hay que editar cada etiqueta; orden de ejecución |
| Cargador propio que tiene en cuenta el consentimiento | SPA y SDK instalados desde npm | SDK que se inicializan en cuanto se importan |
| Configuración de consentimiento del gestor de etiquetas | Equipos que gestionan las etiquetas en un gestor de etiquetas | Cada etiqueta necesita el requisito de consentimiento correcto |
| Bloqueo automático | Sitios heredados grandes con muchas etiquetas incluidas directamente | Debe cargarse primero de forma síncrona; puede pasar por alto scripts o romperlos |
| Marcadores de posición para iframes | Vídeos, mapas y contenidos incrustados de redes sociales | El marcador debe explicar qué implica cargar el contenido |

Las bibliotecas instaladas desde npm nunca aparecen como etiquetas script, así que el bloqueo depende de tu propio código. Llama al `init()` del SDK solo después del consentimiento y cárgalo con `import()` dinámico para que ni siquiera se descargue antes. Ese patrón, y la gestión de decisiones que cambian a mitad de sesión, se explican en [cómo gestionar el consentimiento en aplicaciones SPA](/es/blog/consent-in-single-page-apps).

Las etiquetas de Google tienen una opción adicional. Con Google Consent Mode, las etiquetas pueden cargarse antes del consentimiento y ajustar su comportamiento a las señales de consentimiento en lugar de bloquearse. Si esa configuración encaja con tu tolerancia al riesgo es una decisión aparte; consulta [modo de consentimiento básico frente a avanzado](/es/blog/basic-vs-advanced-consent-mode).

## ¿Cómo compruebo que el bloqueo funciona?

Haz las pruebas como un visitante que llega por primera vez y revisa lo que ocurre realmente en la red y en el almacenamiento:

1. Abre el sitio en una ventana privada nueva desde una región donde aparezca tu banner.
2. Antes de hacer clic en nada, abre DevTools y revisa el panel Network. No debería haber solicitudes a dominios de analítica o publicidad, salvo que hayas elegido deliberadamente una configuración que las envíe.
3. En el panel Application, revisa las cookies, el almacenamiento local y el almacenamiento de sesión. Solo deberían existir entradas estrictamente necesarias.
4. Haz clic en “Rechazar todo” y confirma que no se carga ni se almacena nada nuevo.
5. En una sesión nueva, acepta las categorías de una en una y confirma que solo se cargan sus scripts y contenidos incrustados.
6. Repite tras cada versión que añada una etiqueta y haz periódicamente una [auditoría de cookies](/es/blog/how-to-run-a-cookie-audit) para detectar etiquetas añadidas al margen de tu proceso de publicación.

## En resumen

Bloquear tiene que ver con la ejecución, no solo con las cookies: en cuanto se ejecuta un script no esencial, puede almacenar o leer datos antes de que nadie lo haya aceptado. Publica las etiquetas inertes, actívalas por categoría tras una aceptación, bloquea del mismo modo los contenidos incrustados y los SDK, y haz las pruebas en un navegador limpio. Herramientas como Cookiesh pueden automatizar el paso de activación, ejecutando los scripts etiquetados con `type="text/plain" data-cookiesh="analytics"` solo después de que el visitante acepte esa categoría.

*Este artículo ofrece información general y no constituye asesoramiento jurídico. Para tomar decisiones sobre tu situación concreta, consulta a un profesional cualificado en privacidad.*

## FAQ

### ¿Basta con bloquear las cookies aunque se siga cargando el script?

Normalmente no. La norma de la UE abarca el almacenamiento de cualquier información en el dispositivo y el acceso a ella, no solo las cookies, y un script en ejecución puede usar el almacenamiento local, leer características del dispositivo o enviar identificadores. No ejecutar el script en absoluto es el enfoque fiable.

### ¿Puedo cargar Google Tag Manager antes del consentimiento?

Muchos sitios lo hacen y usan la configuración de consentimiento del contenedor para que cada etiqueta solo se dispare cuando se concede el consentimiento correspondiente. Comprueba en un perfil de navegador nuevo qué hacen realmente el contenedor y cada etiqueta antes del consentimiento, en lugar de dar por hecho que la configuración es correcta.

### ¿Tengo que bloquear scripts para los visitantes de fuera de la UE?

Depende de la ley que se les aplique. Las normas de consentimiento previo y expreso (opt-in), como las de la UE y el Reino Unido, exigen bloquear antes del consentimiento. Con la CCPA y la CPRA de California, la obligación es sobre todo de exclusión (opt-out): debes dejar de vender o compartir información personal cuando un visitante se excluye, también mediante una señal Global Privacy Control.

## Sources

- [Directive 2002/58/EC (ePrivacy Directive), EUR-Lex](https://eur-lex.europa.eu/eli/dir/2002/58/oj)
- [CJEU case C-673/17 (Planet49)](https://curia.europa.eu/juris/liste.jsf?num=C-673/17)
- [EDPB Guidelines 05/2020 on consent](https://www.edpb.europa.eu/our-work-tools/our-documents/guidelines/guidelines-052020-consent-under-regulation-2016679_en)
- [MDN: Using HTTP cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies)
