
Abra sua home numa janela anônima, não clique em nada do banner e olhe a aba Application do DevTools. Se o _ga já está lá, seu banner é decoração: ele informa, mas não bloqueia. A tag do Analytics carregou junto com o resto da página, muito antes de alguém consentir.
O truque pra segurar é velho e continua sendo o mais confiável: o navegador não executa uma tag de script cujo type ele não reconhece. Você troca o src por data-src, marca como text/plain e o arquivo nem chega a ser baixado.
<script type="text/plain" data-cookie="analytics"
data-src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script> function liberarCookies(categoria) {
var seletor = 'script[type="text/plain"][data-cookie="' + categoria + '"]';
document.querySelectorAll(seletor).forEach(function (velho) {
var novo = document.createElement('script');
novo.async = true;
if (velho.dataset.src) {
novo.src = velho.dataset.src;
} else {
novo.textContent = velho.textContent;
}
velho.parentNode.replaceChild(novo, velho);
});
}
var btn = document.getElementById('aceitar');
if (btn) {
btn.addEventListener('click', function () {
localStorage.setItem('consentimento', 'analytics');
liberarCookies('analytics');
});
}
if (localStorage.getItem('consentimento') === 'analytics') {
liberarCookies('analytics');
} Trocar o elemento inteiro é obrigatório. Se você só mudar o atributo type de uma tag que já está no DOM, o navegador ignora: a decisão de executar acontece no momento da inserção, e não tem volta.
Bloquear a tag externa não basta se o bloco de configuração inline continuar rodando, então ele também vira text/plain (sem data-src, o script reaproveita o textContent). Vídeo do YouTube grava do lado dele, pelo iframe: nem o domínio youtube-nocookie zera isso, e a saída ali é uma miniatura clicável enquanto não houver aceite.
Falta o outro lado: recusar tem que ser tão fácil quanto aceitar, e o botão de recusa só grava negado no mesmo item, sem injetar nada. Depois de mexer, repita o teste da janela anônima. Nenhum cookie de terceiro antes do clique, todos depois: esse é o único resultado que vale.
Var_dump esquecido e senha de teste passam batido no commit. Um script PHP que lê o git diff --staged e…
O campo está no schema.graphqls e a API insiste em Cannot query field. Limpe o cache certo, recompile o generated…
Padrão registrado no functions.php que não aparece na aba Padrões. O caminho curto do WordPress 6.9: um arquivo PHP na…
Disco lotando por causa do banco? Uma query no information_schema mostra qual tabela cresceu, quanto é dado, quanto é índice…
Sistema em CodeIgniter 3.1.13 morre no primeiro request depois do upgrade. Os três pontos que quebram no PHP 8.3 e…
Metade do seu pub/media é miniatura descartável. Veja o rsync com os excludes certos e o comando que reconstrói o…