Gesponserte Beiträge auf LinkedIn / Facebook / Twitter / X ausblenden — CSS + MutationObserver
Social-Media-Feeds bestehen zu ~30 % aus gesponserten Beiträgen, die unter den organischen gemischt sind. Gesponserte Beiträge sind so gestaltet, dass sie nicht wie Werbung aussehen — zufällige Klassen-Hashes, dynamisches DOM. Standard-Adblocker erwischen sie per URL-Muster (DoubleClick, AdSense), nicht per Feed-Layout. Genau hier glänzt die JustZix-Kombination aus CSS + JS.
LinkedIn (linkedin.com)
LinkedIn hat das am stärksten verschleierte DOM. Klassennamen wie .feed-shared-update-v2--ad sind stabil, ändern sich aber bei jedem Redesign. Text-Matching ist zuverlässig:
/* CSS-Versuch — erwischt einige */
[data-ad-banner], .feed-shared-update-v2--promoted,
.feed-shared-actor__sub-description:has-text("Promoted") {
display: none !important;
}
CSS :has-text() ist KEIN Standard — das ist ein JustZix-eigenes Pseudo. Fallback über JS-MutationObserver:
// JS-Regel — Text-Match „Promoted" in Feed-Karten
const hideSponsored = () => {
document.querySelectorAll('.feed-shared-update-v2, [data-id*="urn:li:activity"]').forEach(card => {
if (card.dataset.jzChecked) return;
card.dataset.jzChecked = '1';
const text = card.textContent;
if (/^Promoted|Sponsored/m.test(text) ||
/\bPromoted\b/.test(card.querySelector('.feed-shared-actor__sub-description')?.textContent || '')) {
card.style.display = 'none';
JUSTZIX.log(`[LinkedIn] Gesponserte Karte ausgeblendet`);
}
});
};
new MutationObserver(hideSponsored).observe(document.body, {childList: true, subtree: true});
hideSponsored();
Facebook (facebook.com)
FB hat ARIA-basierte Marker — stabiler als Klassennamen:
/* Beiträge mit „Sponsored"-Label — Facebook nutzt ARIA-Attribute */
div[aria-label="Sponsored"],
div:has(> * > span[aria-label="Sponsored"]),
[data-pagelet*="Sponsored"] {
display: none !important;
}
/* Seitenleiste mit „Suggested for you" */
[aria-label="Suggested for you"], [aria-label="Reels and short videos"] {
display: none !important;
}
JS-Booster — räumt den Feed beim Scrollen auf, da Infinite-Scroll neue Beiträge nachlädt:
// JS-Regel
new MutationObserver(() => {
document.querySelectorAll('div[role="feed"] > div').forEach(post => {
if (post.dataset.jzChecked) return;
post.dataset.jzChecked = '1';
if (post.querySelector('[aria-label="Sponsored"]')) {
post.style.display = 'none';
JUSTZIX.log('[FB] Gesponserten Beitrag ausgeblendet');
}
});
}).observe(document.body, {childList: true, subtree: true});
Twitter / X (twitter.com / x.com)
X hat ein „Promoted"-Label als SVG-Icon + Text. Twitter hat außerdem „Suggestions" / „Trends for you"-Seitenleisten:
/* Gesponserte Tweets */
article:has([data-testid="promotedIndicator"]),
article:has(svg[data-testid="ad"]) {
display: none !important;
}
/* Trends + Wem folgen-Seitenleiste */
[aria-label="Timeline: Trending now"],
[data-testid="sidebarColumn"] [data-testid="UserCell"] {
display: none !important;
}
Anwendungsfall 1 — TOGGLE3 „Werbeschutz-Stufe"
Dreistufige Strenge pro Plattform:
// Aktion TOGGLE3 „🛡️ Schutz"
states[0] = { label: 'Off', value: 'off' } // kein Filtern
states[1] = { label: 'Normal', value: 'normal' } // Gesponsertes ausblenden
states[2] = { label: 'Strict', value: 'strict' } // Gesponsertes + Vorgeschlagenes + Trends ausblenden
code: |
document.documentElement.dataset.jzProtection = value;
JUSTZIX.log(`Schutz: ${value}`);
Die CSS-Regel nutzt das data-Attribut:
html[data-jz-protection="off"] .jz-hide-sponsored { display: block !important; }
html[data-jz-protection="strict"] [aria-label*="Suggested"] { display: none !important; }
Anwendungsfall 2 — Output Console zählt ausgeblendete Elemente
// In einer JS-Regel:
let hiddenCount = 0;
window.JZ_HIDDEN_SPONSORED = () => {
JUSTZIX.log(`[${location.hostname}] Anzahl ausgeblendeter gesponserter: ${hiddenCount}`);
};
// In jedem .style.display = 'none' hochzählen: hiddenCount++;
// Aus der JS Console aufrufen: JZ_HIDDEN_SPONSORED()
Fallstricke
- Selektoren ändern sich. Social-Media-Plattformen reorganisieren das DOM oft, um das Blockieren zu erschweren. Teste die Regeln monatlich.
- Text-Matching ist fragil für i18n. „Promoted" / „Sponsored" / „Gesponsert" / „Werbung" — verschiedene Sprachen. Füge eine Regex-Disjunktion hinzu.
- MutationObserver ist bei großen Feeds teuer. Throttle den Observer (setTimeout 200ms Debounce), wenn die FPS einbrechen.
- :has-text() ist kein CSS-Standard. JustZix unterstützt es. In nativem CSS nutze :has(div:contains(...)) (ebenfalls nicht-Standard) oder einen JS-Observer.
Wie es weitergeht
- Cookie-Banner ausblenden — Schwester-Muster
- KI-Chat-Apps anpassen — CSS + JS-Observer-Muster
- TOGGLE3 — 3-Zustands-Schutz-Umschalter
Installiere JustZix und hol dir 30 % deines Feeds für organischen Content zurück.
Bewerte diesen Beitrag
Noch keine Bewertungen — sei der Erste.