From fbeda6a528441f93d4bcaabff318b245ae270934 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 18 May 2026 15:31:39 +0200 Subject: [PATCH] =?UTF-8?q?F=C3=BCge=20Beobachtungslogik=20hinzu,=20um=20e?= =?UTF-8?q?ingef=C3=BCgte=20Anzeigenknoten=20zu=20erkennen=20und=20in=20de?= =?UTF-8?q?n=20Platzhalter=20zu=20verschieben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/HeaderAdBanner.vue | 46 ++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/client/src/components/HeaderAdBanner.vue b/client/src/components/HeaderAdBanner.vue index ed4619f..812658e 100644 --- a/client/src/components/HeaderAdBanner.vue +++ b/client/src/components/HeaderAdBanner.vue @@ -121,6 +121,52 @@ async function renderPropeller() { const placeholder = document.createElement('div'); placeholder.className = 'propeller-ad-placeholder'; adContainer.value.appendChild(placeholder); + + // Observe the document for injected ad nodes and relocate them into our placeholder + const observeAndRelocate = () => { + const parent = document.body; + try { + const observer = new MutationObserver(mutations => { + for (const m of mutations) { + for (const node of Array.from(m.addedNodes)) { + if (!(node instanceof HTMLElement)) continue; + const src = (node.tagName === 'IFRAME' && node.getAttribute('src')) || ''; + const isAdNode = src.includes('nap5k') || (node.dataset && node.dataset.zone === propSlotId) || /nap5k|propel|propeller|inpage|push/i.test(node.className + ' ' + node.id); + if (isAdNode) { + try { + placeholder.innerHTML = ''; + placeholder.appendChild(node); + node.style.maxWidth = '100%'; + node.style.display = 'block'; + observer.disconnect(); + try { window.dispatchEvent(new CustomEvent('ads:relocated',{detail:{provider:'propeller',zone:propSlotId}})); } catch {} + return; + } catch (e) { + console.warn('Failed to relocate ad node', e); + } + } + } + } + }); + observer.observe(parent, { childList: true, subtree: true }); + + // Check existing iframes right away + const existing = Array.from(document.querySelectorAll('iframe')).find(f => (f.src || '').includes('nap5k')); + if (existing) { + placeholder.innerHTML = ''; + placeholder.appendChild(existing); + observer.disconnect(); + } + + // Failsafe: stop observing after 6s + setTimeout(() => observer.disconnect(), 6000); + } catch (e) { + console.warn('observeAndRelocate error', e); + } + }; + + // Start observing shortly after script insertion to allow provider to run + setTimeout(observeAndRelocate, 100); } catch (err) { console.warn('Propeller ad load failed', err); }