From 7edddada8928c06f891b8a7fdcfd14decdd866bf Mon Sep 17 00:00:00 2001 From: FrankZamora Date: Fri, 28 Nov 2025 21:10:40 -0600 Subject: [PATCH] fix(adsense): ocultar anchor ads cuando AdSense no llena el slot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Agregar watchUnfilledAds() con MutationObserver - Detectar data-ad-status="unfilled" de AdSense - Timeout de 5s como respaldo si no hay contenido - Evitar mostrar espacio en blanco cuando no hay anuncio 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../Ui/Assets/anchor-vignette.js | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/Public/AdsensePlacement/Infrastructure/Ui/Assets/anchor-vignette.js b/Public/AdsensePlacement/Infrastructure/Ui/Assets/anchor-vignette.js index 1e3baaaa..27f224bb 100644 --- a/Public/AdsensePlacement/Infrastructure/Ui/Assets/anchor-vignette.js +++ b/Public/AdsensePlacement/Infrastructure/Ui/Assets/anchor-vignette.js @@ -86,6 +86,54 @@ // ANCHOR ADS // ===================================================== + /** + * Observa los slots de AdSense y oculta el contenedor si no se llena + * AdSense agrega data-ad-status="unfilled" cuando no hay anuncio + */ + function watchUnfilledAds(containers) { + containers.forEach(function(container) { + var ins = container.querySelector('ins.adsbygoogle'); + if (!ins) return; + + // Verificar si ya tiene estado (por si ya cargo) + var status = ins.getAttribute('data-ad-status'); + if (status === 'unfilled') { + container.classList.add('hidden'); + return; + } + + // Usar MutationObserver para detectar cambios + var observer = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + if (mutation.type === 'attributes' && mutation.attributeName === 'data-ad-status') { + var newStatus = ins.getAttribute('data-ad-status'); + if (newStatus === 'unfilled') { + container.classList.add('hidden'); + observer.disconnect(); + } + } + }); + }); + + observer.observe(ins, { + attributes: true, + attributeFilter: ['data-ad-status'] + }); + + // Timeout de seguridad: si despues de 5s no hay contenido, ocultar + setTimeout(function() { + var adStatus = ins.getAttribute('data-ad-status'); + // Si no tiene status o esta unfilled, y no tiene contenido real + if (!adStatus || adStatus === 'unfilled') { + if (ins.innerHTML.length < 100) { + container.classList.add('hidden'); + } + } + observer.disconnect(); + }, 5000); + }); + } + function initAnchorAds() { var config = getConfig('roi-anchor-config'); if (!config) return; @@ -109,6 +157,9 @@ } }); + // Ocultar anchors cuando AdSense no llena el slot + watchUnfilledAds(anchors); + // Event delegation para botones document.addEventListener('click', function(e) { var btn = e.target.closest('[data-action]');