Ganglion není životu nebezpečný, přesto dokáže nepříjemně potrápit. Někdy však není potřeba ho léčit

26. 5. 2025 7:30
7 nových názorů
ručitel
MUDr. Daniel Petr | Odborný garant článku
„Pokud vás ganglion omezuje v běžných činnostech, obraťte se na svého lékaře.“

Nahmatali jste si na zápěstí drobnou bulku nebo se vám snad na prstě objevil nevzhledný útvar, kterým je možné mírně pohybovat? Může se jednat o ganglion, což je zduření v podkoží objevující se blízko šlach či kloubů. Přestože ganglionové cysty bývají nezhoubné, mohou člověka omezovat v běžných činnostech a někdy jsou také velmi bolestivé.

Co je ganglion?

Co se dozvíte v článku
  1. Co je ganglion?
  2. Jaké má ganglion příčiny?
  3. Jaké má ganglion příznaky?
  4. Diagnostika
  5. Léčba ganglionu

Pod tímto názvem se ukrývá podkožní útvar naplněný rosolovitou hmotou, jenž se typicky objevuje nedaleko kloubu nebo šlachy. Jde konkrétně o kulatý nebo oválný synoviální váček (pseudocystu), jehož rozměry se případ od případu liší. Zatímco u některých pacientů dosahuje velikosti hrášku, jindy může být velký dokonce jako golfový míček nebo třeba slepičí vejce.

Se vznikem ganglií se nejčastěji setkávají mladí lidé ve věku od 15 do 40 let. Potýkají se s nimi hlavně gymnasté a další sportovci, přičemž jde spíše o ženy než o mužskou část populace. Obecně se pak ganglionové cysty objevují hlavně na místech, kde se nachází větší množství vazivové tkáně. Pacienti si pak stěžují především na následující obtíže:

  • ganglion na ruce,
  • ganglion na zápěstí,
  • ganglion na dlani,
  • ganglion na prstu ruky,
  • ganglion na noze,
  • ganglion na koleni,
  • ganglion na nártu,
  • ganglion na kotníku,
  • ganglion na chodidle.

Některé ganglionové cysty je možné na místě výskytu pohmatem volně posunout, jiné ovšem zůstávají zcela nehybné. Dané výrůstky, které se anglicky označují termínem ganglion cyst, přitom samy o sobě nijak nebezpečné nejsou. Na okolí však mohou působit značně neestetickým dojmem a pacienta mohou omezovat v běžném pohybu a provádění každodenních činností. [1, 2, 3, 45]

Jaké má ganglion příčiny?

Mechanismus vzniku těchto obtíží prozatím není přesně známý. Základem rosolu, který tvoří výplň ganglionu, je nicméně synoviální (kloubní) tekutina. Pokud uniká z přítomného kloubu nebo šlachové pochvy a začne se hromadit na jednom místě, může pak zhoustnout a proměnit se právě v rosolovitou hmotu, která má polotekutý charakter a na postiženém místě vytváří malou cystu.

Ganglionové cysty nejčastěji najdete na místech, kde dochází k výraznějšímu tření. Postižena bývá hlavně oblast zápěstí, hřbetní strany ruky nebo dokonce prstů. Svou úzkou stopkou přitom ganglion ústí hluboko do kloubu nebo přímo souvisí se šlachovitým kanálem na postiženém místě. Mechanickým tlakem na okolní struktury pak vyvolává nepříjemný tlak a bolest.

Za rozvoj tohoto problému může být zodpovědné například chronické přetěžování přítomných struktur nebo přílišné namáhání šlach. Ganglion se tedy objevuje především u pacientů, kteří se věnují jednostranné manuální práci nebo provádějí stereotypní pohyby rukou či prstů. Nevyhýbá se však ani oblasti dolních končetin, hlavně kotníkům a chodidlům.

Svou roli zde ovšem mohou sehrát i další faktory, kam patří například menší či větší úrazy a poranění, lokální infekce nebo provedené operační zákroky. Dále se pak může jednat o některá onemocnění kloubů a šlach, jako je chronický zánět kloubů. Na vině nicméně bývají i kloubní změny z důvodu artrózy, zlomeniny či kostního nádoru. [6, 7, 8, 9, 10]

Jaké má ganglion příznaky?

Ačkoliv ganglion nemusí pacientovi způsobovat žádné potíže, někdy má na svědomí nepříjemnou bolest, která se objevuje zejména po jeho stlačení nebo v momentě, kdy se člověk snaží provést nějaký specifický pohyb. Postižené místo také může být zatuhlé, což vede k tomu, že je rozsah pohybu v konkrétním kloubu celkově omezený.

Na bolest spojenou s výskytem ganglionu si pacienti stěžují většinou v momentě, kdy se bulka poprvé objeví. Problematické ovšem mohou být i jiné situace, například když se ganglion zvětšuje, mění svůj tvar nebo je daná oblast více namáhána (během sportovní aktivity nebo po ní, při práci na počítači). Dále pak může ganglion v místě výskytu způsobit také nepříjemný tlak, a dojde-li k útlaku nervů, výsledkem bývá také brnění, necitlivost či svalová slabost.

Kromě toho je samozřejmě nutné zohlednit také estetickou stránku věci. Pokud se ganglion nachází na dobře viditelném místě, jako je například zápěstí, nebo doroste do větších rozměrů, působí samozřejmě velmi nevzhledně. Okolí si takové vady všímá, což může u některých pacientů vyvolat psychické potíže.

Druhý ganglií:

  • ganglia dorzálně na zápěstí (v zadní části) – jde o nejčastější variantu, která postihuje spíše mladé dospělé a mnohdy vymizí bez jakékoliv léčby,
  • ganglia palmárně na zápěstí (v přední části) – postihuje mladší jedince i starší osoby, které se potýkají s artritidou,
  • ganglia na prstech ruky – obvykle se objevují na špičce prstu, někdy se jim říká také slizniční cysty (mucous cysts) a postihují zejména pacienty středního či staršího věku,
  • ganglia na palci – tato varianta je vzácnější než ganglion na ostatních prstech, přičemž bývá spojená s bolestmi, ztuhlostí kloubu a omezenou pohyblivostí,
  • ganglia na lokti – tyto cysty jsou spíše vzácné, ale pokud se objeví, většinou omezují pohyblivost kloubu a způsobují rozvoj bolestí, jejichž intenzita různě kolísá,
  • ganglia na noze – objevují se hlavně v oblasti kotníku či nártu a bývají spojené s přítomností kostních výrůstků nebo s artritickým poškozením kloubů a šlach,
  • intraoseální ganglia – nachází se uvnitř kosti, jde o velmi vzácný problém. [11, 12, 13, 14, 15, 16]

Diagnostika

Přestože si spousta lidí při pohledu na ganglion myslí, že se jedná o nějakou zhoubnou rakovinovou bulku, ve skutečnosti se v tomto případě není čeho obávat. Ganglionové cysty jsou totiž nezhoubné a pacienty nemusí nijak obtěžovat (obzvláště ty hodně malé). Mohou však měnit svou velikost, někdy bývají bolestivé, pokud utlačují okolní struktury, a mnohdy omezují pohyblivost kloubů.

Potničky u dospělých způsobuje ucpání vývodů potních žláz. Nejčastěji se objevují kolem genitálií a pod prsy
Přečtěte si také:

Potničky u dospělých způsobuje ucpání vývodů potních žláz. Nejčastěji se objevují kolem genitálií a pod prsy

Pokud jste zaznamenali přítomnost podkožního útvaru, který vám připadá podezřelý, nebo si všímáte, že se dříve drobná bulka najednou rychle zvětšuje, je načase vyhledat lékaře. Ten provede fyzikální vyšetření pohledem i pohmatem a může také ganglion prosvítit silným zdrojem světla, aby se ujistil, že se uvnitř skutečně nachází čirá a hustá tekutina.

Pro potvrzení této diagnózy je pak dobré provést také další vyšetření, která pomohou lékaři ganglion a jeho okolí detailněji prozkoumat a odlišit od dalších podobných struktur (například od zvětšené uzliny nebo lipomu). Sem patří především následující zobrazovací metody:

Získá-li ovšem lékař podezření, že by za vznikem útvaru mohlo stát nějaké závažnější (potenciálně zhoubné) onemocnění, je možné přistoupit k biopsii. Odebraný vzorek tkáně se pak odesílá na histologické vyšetření, s jehož pomocí je možné potvrdit, o jaký útvar se vlastně jedná. Ganglia by totiž měla obsahovat hustou čirou tekutinu, ne žádnou pevnou tkáň. [17, 18, 19, 20, 21, 22]

Léčba ganglionu

Jestliže jste někde na svém těle objevili tento neestetický útvar, pravděpodobně přemýšlíte, jaká existuje pro ganglion léčba. Dobrou zprávou je, že pokud se skutečně jedná o tento problém, nepředstavuje pro vás žádné velké nebezpečí. Neomezuje-li vás tedy v běžném fungování a nezpůsobuje-li vám nepříjemné bolesti, nemusíte ho nijak léčit.

V určitých případech se dokonce může stát, že ganglion sám od sebe postupem času vymizí, aniž byste jeho přítomnost museli nějakým způsobem řešit. Problém nicméně spočívá v tom, že ganglia mají tendenci se po čase opět vracet. Důležité je v dané situaci kontaktovat svého lékaře, což platí také pro chvíle, kdy se útvar zvětšuje, nápadně mění tvar nebo se mění barva okolní pokožky.

Ať už se jedná o malý útvar o velikosti hrášku, nebo jde o ganglion velký jako slepičí vejce, na okolí může působit neestetickým dojmem, což pacientům často vadí. Také může mít na svědomí nepříjemnou bolest, kterou pomáhá tlumit analgetická mast na ganglion. Ulevit od potíží může také nošení dlahy, která na čas omezí pohyblivost postižené oblasti.

Nechali jste si někdy odstranit ganglion?

Pokud odstranění zátěže a úleva poskytnutá kloubům v místě výskytu ganglionu nevede k jeho postupnému zmenšování a masti ani dlahy také nepomáhají, existují i další možnosti léčby. Mezi terapeutické postupy, které pomáhají pacientům tlumit obtíže, patří například magnetoterapie, léčba ultrazvukem, laser nebo také rázová vlna. Dobrá je i návštěva fyzioterapeuta, který pomůže mobilizovat klouby a uvolnit měkké tkáně (šlachy, svaly, vazy i kloubní pouzdra).

Operační zákrok

Jestliže problémy přetrvávají i ve chvíli, kdy pacient vyzkouší výše zmiňované léčebné postupy, je nutné přistoupit k chirurgickému odstranění ganglionu. To je možné provést dvěma různými způsoby, a sice odsátím nahromaděné tekutiny aspirační jehlou, nebo případně radikálním vyříznutím celého podkožního útvaru naplněného rosolem.

Aspirace (odsátí) obsahu ganglionu pacientovi přináší značnou úlevu. Daná metoda je přitom méně invazivní než přímé vyříznutí neestetické bulky, ale zároveň se pojí s rizikem, že se nepodaří odsát všechnu přítomnou tekutinu a ganglion se po čase znovu objeví.

Aby na místě nedošlo k rozvoji zánětu, lékař může provést také aplikaci kortikoidů do operované oblasti. Toto preventivní opatření s sebou nicméně přináší i velkou nevýhodu, protože kortikoidy vysušují měkké tkáně, které jsou pak křehčí a náchylnější k praskání nebo rozvoji artrózy.

Druhou variantou je potom vyříznutí ganglionu a vyčištění okolí kloubu a šlach. V některých případech je nutné odstranit nejen samotný rosolovitý útvar, ale i další tkáň, tedy šlachovou pochvu a kloubní pouzdro. To by mělo zabránit opakovanému vzniku problematické bulky.

Aby operované šlachy dobře srostly, pacient musí po vyříznutí ganglionu nosit několik týdnů znehybňující dlahu. Ani v tomto případě bohužel nelze vyloučit, že se ganglion po nějakém čase na postiženém místě znovu objeví.

Možné komplikace

S léčbou ganglií mohou být spojené i určité komplikace nebo drobné anatomické změny. V místě, kde se ganglion nacházel, může po jeho odstranění dojít například ke ztenčení kůže či hypopigmentaci. Někdy se také objevuje ztuhlost kloubů a snížený rozsah pohybu. Ve vzácnějších případech pak může zákrok způsobit poranění nervů a šlach.

Po prodělaném zákroku by však měl být pacient schopen odejít domů. Než vás lékař z nemocnice propustí, měl by vás informovat o tom, jak se o danou oblast starat a případně jak s ní cvičit, aby došlo k rychlé rekonvalescenci. Počítejte také s tím, že kloub může být po provedeném zákroku bolestivý.

Ganglion: přírodní léčba

V minulosti se doporučovalo místo ganglionu udeřit nějakým tupým a těžkým předmětem, což by mělo útvar zlikvidovat. Dnes je však již zcela jasné, že tato metoda je velmi nebezpečná a může poranit okolní struktury a způsobit prasknutí cysty, jejíž obsah se potom vylije do okolí. To může navíc vést k rozvoji zánětu. Proto daný způsob nikdy doma nezkoušejte.

Někteří lidé však přistupují k namáčení postiženého místa v mořské vodě nebo případně ve vřídelní vodě. Úlevu od potíží navíc může přinést také zahřívání dané oblasti pomocí speciálních obkladů nebo návleků. Vždy se ovšem dopředu poraďte se svým ošetřujícím lékařem, který rozhodne, zda je nutné léčit ganglion operací, nebo postačí jiné léčebné procedury. [23, 24, 25, 26, 27, 28, 29, 30, 31]

Zdroje: stefajir.cz, wikiskripta.eu, fyzioklinika.cz, cs.medlicker.com, mayoclinic.org, my.clevelandclinic.org, ncbi.nlm.nih.gov, healthline.com, eatonhand.com, webmd.com, orthoinfo.aaos.org

lomihnát (neregistrovaný)

Kamarádovi, nyní 60 r., se to občas vytvoří na zápěstí. Když ho to začne obtěžovat, přikládá si na ruku položenou na stole přes bouli kuchyňské prkénko a požádá někoho, aby do něj (=prkénka) silně praštil ... Rok až dva má pokoj ...

borůvka (neregistrovaný)

Možná životu není nebezpečná, ale je velice bolestivá. Syn jich má v těle hodně a to na rukou i nohou. Některé mu odoperovali, ale bohužel znovu se objevily. Má je i v rozkroku a má problémy s chůzí. Bylo mu řečeno, že v těch místech není možno operovat. Takže Jeho chůze je bolestivá.

Kala (neregistrovaný)

Mě se opakovaně tvořil na zápěstí. Vytvořil se znovu i po operaci. Rehabilitační lékař mi předepsal magnetoterapii, zabrala zhruba na rok, po roce narostl znovu, znovu magnetoterapie. Když se pak po dalším roce začal tvořit znovu, objednala jsem si magnetický náramek. Stálé působení slabých magnetů zabralo, nenarostl. Náramek jsem ztratila a myslela jsem si, že už je vše v pořádku. Po pár měsících se potíže začaly vracet, hned jsem objednala další náramek, nosím ho a mám pokoj.

Renáta Bogdániová (neregistrovaný)
Mne sa to vracia pri väčšej pracovnej záťaži. Raz mi bol ganglión zo zápästia injekčne odsatý, ale rýchlo znovu narástol. Pričom zákrok bol značne bolestivý, teda ho ani neodporúčam podstupovať. Na druhý krát sa mi ho podarilo zbaviť zase len prácou, zrejme vačok praskol a tekutina sa rovnomerne rozliala a vstrebala. Aktuálne mám zase. Používam tlakový obväz. Jednak tlmí bolesť a jednak zabraňuje prudkému a neestetickému rastu.
  • Našli jste v článku chybu?
'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »