Syndrom karpálního tunelu

Začínají vás při práci s počítačem čím dál častěji brnět prsty? Pozorujete opakované mravenčení rukou, které vás nutí horní končetiny neustále protřepávat? Nebo se snad potýkáte se ztrátou citlivosti v předloktí a nejste schopní dobře uchopit menší předměty? V tom případě se u vás zjevně rozvinul syndrom karpálního tunelu. Prozradíme, co ho způsobuje a jakou vyžaduje léčbu.

Kde najdete karpální tunel?

Karpální tunel je topografická anatomická oblast, jež propojuje předloktí a zápěstí. Ve skutečnosti se jedná o jakousi úžinu, kterou prochází nervy, šlachy ohýbačů a drobné cévy, což lidem umožňuje účinně pohybovat zápěstím. Ze stran jsou přitom karpální tunely ohraničené vyvýšeninami zápěstních kostí, kde zadní stěnu tvoří zápěstní kůstky a tu přední kryjí zápěstní poutka ohýbačů.

Prostřednictvím vazivové přepážky je pak karpální tunel rozdělený na dvě samostatné části. Ulnární oddíl, jenž se nachází na straně malíčku, zahrnuje středový nerv, hluboký ohýbač prstů (4 šlachy), povrchový ohýbač prstů (4 šlachy) a dlouhý ohýbač palce (1 šlacha). V radiálním oddílu, který je umístěný na straně palce, pak najdete vřetenní ohýbač zápěstí (1 šlacha).

Nedílnou součástí karpálního tunelu je mediální (středový) nerv, který inervuje ruku. Ten zajišťuje, že bude schopná reagovat na různé podněty (senzitivita) a zároveň je důležitý také z pohledu jemné i hrubé motoriky. Zodpovídá například za přenos motorických stimulů z mozku přímo do ruky. O jeho výživu se pak starají jemné cévy, které se nachází v blízkosti středového nervu.

Dojde-li v dané oblasti k útlaku a přestane-li být správně zásobována krví, u pacienta se začne rozvíjet syndrom karpálního tunelu. Tomu lidé někdy mylně říkají pouze karpální tunel, ačkoliv tento termín označuje konkrétní anatomickou oblast, nebo třeba zánět karpálního tunelu.

Co je syndrom karpálního tunelu?

Syndrom karpálního tunelu (SKT, syndroma canalis carpi) je bolestivé onemocnění, které má na svědomí útlak středového nervu v karpálním tunelu. K tomuto poškození může dojít různými způsoby, ale nejčastěji se to děje vlivem dlouhodobého přetěžování, úrazu nebo jiného onemocnění. Svou roli zde ovšem může sehrát kombinace většího množství faktorů.

Jelikož je karpální tunel úžinou, anatomicky predisponuje k postižení obsaženého nervu. Jakákoliv abnormita v jeho blízkosti pak má za následek zmenšení okolního prostoru, což způsobí kompresi mediálního nervu, ischemizaci a vznik otoku. Tím se ještě zvýší tlak v místě průchodu karpálním tunelem, přičemž přetrvávající obtíže mohou následně vyvolat strukturální změny v nervu a řadu zdravotních komplikací.

Syndrom karpálního tunelu je v současné době jedním z nejčastějších onemocnění horních končetin. Řadí se mezi úžinové syndromy, což je skupina chorob, které se označují také jako chronické mononeuropatie. To znamená, že za jejich rozvoj je zodpovědný útlak vybraného nervu okolními strukturami. Kromě toho jsou podle lékařů karpály nemoc z povolání (jedna z nejčastějších).

Formy nemoci:

  • akutní syndrom karpálního tunelu – na vině bývá rychlé a intenzivní zvýšení tlaku v oblasti karpálního tunelu, což může být zapříčiněno třeba zlomeninou, popáleninou nebo lokální infekcí,
  • chronický syndrom karpálního tunelu – tato varianta se rozvíjí pomaleji, zatímco jednotlivé příznaky postupem času nabývají na intenzitě.

Co se týče výskytu, syndrom karpálního tunelu postihuje ženy až čtyřikrát častěji než muže (objevuje se třeba během těhotenství). Průměrný věk pacientů se pohybuje kolem 40–60 let, což souvisí s možnými příčinami, ale rozhodně to není pravidlem. Dnes se například běžně setkáváme se syndromem karpálního tunelu i v případě mnohem mladších pacientů, přičemž poměrně často bývá oboustranný.

Příčiny syndromu karpálního tunelu

Rozvoj tohoto onemocnění může mít na svědomí celá řada faktorů, které se navíc často kombinují. Jakákoliv abnormalita mediálního nervu nebo jeho blízkého okolí přitom způsobí útlak, který může mít na svědomí různé strukturální změny včetně postupné ztráty funkčnosti jednotlivých motorických a senzitivních vláken.

K nejčastějším příčinám syndromu karpálního tunelu dnes patří nadměrná zátěž vyvíjená na pacientovo zápěstí, které je vystaveno dlouhodobému, nepřiměřenému či jednostrannému tlaku. Důvodem může být třeba celodenní práce s počítačovou myší a klávesnicí, kdy dochází ke zbytnění vazu, který karpální tunel překrývá. Rizikové jsou ovšem i další činnosti:

  • práce s vibračními nástroji – vrtačka, pneumatické kladivo, sbíječka,
  • práce se zahradními nůžkami, kleštěmi a šroubováky,
  • práce s razítky a různé extrémní pohyby zápěstí,
  • hra na některé hudební nástroje (například strunné).

Syndrom karpálního tunelu se ale samozřejmě může rozvinout také vlivem anatomických změn a odlišností, jako je hypertrofický karpální vaz či zúžený karpální tunel od narození. Svou roli pak hrají i různé úrazy, poranění nebo zlomeniny v oblasti karpálního tunelu. Vznik tohoto onemocnění však mohou mít na svědomí také další faktory:

  • obezita,
  • hematom,
  • cévní anomálie,
  • vznik osteofytů (výrůstků),
  • tendovaginitida – zánět šlachy a jejího pouzdra,
  • anomálie týkající se odstupů šlach,
  • edém měkkých tkání způsobený mechanickým přetěžováním,
  • ganglion – synoviální váček blízko kloubu či šlachy,
  • životní styl – kouření, nedostatek pohybu, jídelníček,
  • hormonální změny – těhotenství, menopauza,
  • užívání hormonální antikoncepce.

Kromě výše zmíněných příčin mohou být za rozvoj syndromu karpálního tunelu zodpovědné také procesy, které zvyšují zranitelnost nervu a jeho citlivost na tlak. Sem patří například neuropatie, které vznikají na podkladě jiného onemocnění (diabetes mellitus), ale i vlivem jiných příčin, jako jsou výživové karence nebo třeba alkoholismus.

Vznik syndromu karpálního tunelu lékaři někdy přičítají také dalším chorobám, kam se řadí třeba revmatoidní artritida, systémový lupus erythematodes či akromegalie. Dále pak toto onemocnění někdy souvisí s vysokým krevním tlakem pacienta a způsobit ho může také Raynaudův syndrom, selhání ledvin, lymdefém, dna nebo onemocnění štítné žlázy (tyreopatie).

Jaké má syndrom karpálního tunelu příznaky?

Typickým signálem, který na syndrom karpálního tunelu člověka upozorní, je brnění prstů na ruce (hlavně palce, ukazováčku, prostředníčku a poloviny prsteníčku), silné mravenčení nebo dlouhotrvající pálení dlaní. Zatímco někdy se pak problém omezuje pouze na menší oblasti, jindy mohou pacienti zaznamenat nepříjemné pocity v celé postižené horní končetině.

Kromě těchto klasických problémů si nemocní obvykle stěžují také na vznik otoků, ztuhlost zápěstí nebo silnou bolest, která se šíří od dlaní směrem k loktu. Bohužel ale není výjimkou, že se situace postupně zhoršuje a pacienti tak pociťují bolest také v oblasti ramenního kloubu a krční páteře, k čemuž se nezřídka přidávají i bolesti hlavy.

Brnění je obvykle nejhorší v noci, kdy pacienta nenechá v klidu usnout nebo ho dokonce budí ze spánku. Člověk si pak snaží ulevit například protřepáním ruky nebo ponořením prstů do chladné vody. Postupem času ale může docházet také ke snižování citlivosti v prstech (nebo v celé horní končetině) a obtíže se začnou objevovat také v průběhu dne. Patří sem:

  • pocit oteklé ruky bez zjevného otoku,
  • padání předmětů z ruky vlivem slabých svalů,
  • brnění prstů při manuálních činnostech (práce na zahradě),
  • brnění prstů při zalomení zápěstí ve statické poloze (držení řídítek),
  • brnění prstů při zvedání horní končetiny (uchopení madla v MHD).

Dalším důsledkem syndromu karpálního tunelu pak může být zhoršení jemné motoriky, které se projeví třeba neschopností brát do ruky malé předměty (jehlu, špendlík) nebo zapnout si knoflíky. Pacienti ale v horších případech mohou mít problémy také se psaním, s otevíráním dveří, s držením knihy či volantu nebo s úchopem větších předmětů (ucho hrnku), které jim pak často padají z ruky.

Pokud jde o to, jaké má karpální tunel příznaky, zapomínat byste samozřejmě neměli ani na autonomní symptomy, jako je změna teploty v postižené oblasti nebo třeba netypické zbarvení kůže a nehtů. V těžších stádiích pak mohou senzitivní projevy postupně mizet, ale vlivem těžké denervace se přidává atrofie drobných svalů thenaru. Když pak člověk své obtíže včas nezačne řešit, problémy se budou zhoršovat a objeví se i vegetativní příznaky.

Diagnostika

Pokud zaznamenáte některé výše popsané příznaky karpálního tunelu, měli byste začít situaci co nejrychleji řešit a vyhledat lékaře. Ten se bude zajímat hlavně o vaši anamnézu a provede také fyzikální vyšetření, aby zjistil, jak závažná situace ve skutečnosti je. K tomu se přidávají také další testy včetně EMG vyšetření a zobrazovacích metod (CT, magnetická rezonance, rentgen, sonografie).

Fyzikální vyšetření a provokační testy

Lékaři sledují hlavně poruchy citlivosti, které jsou posuzovány na 2. prstu a následně porovnány s 5. prstem. Kromě toho může být patrný motorický defekt. Ten se dá odhalit příznakem svíčky, jenž se projevuje částečnou poruchou opozice palce a vztyčení palce kolmo k rovině dlaně. Vzniklá atrofie pak vytváří jamku laterálně na thenaru, ale čití nad ním bývá normální.

Kromě toho pak lékaři v rámci diagnostiky syndromu karpálního tunelu využívají také řadu provokačních testů, což jsou manévry, prostřednictvím kterých se v karpálním tunelu zužuje prostor pro nerv. S jejich pomocí je možné odhalit, že se skutečně jedná o toto onemocnění. Patří sem:

  • Tinelův test (příznak) – lékař poklepe kladívkem či prstem nad karpální tunel a objeví se bolest či parestézie (pozitivní bývá u 60 % nemocných).
  • Obrácený Tinelův příznak – jde o situaci, kdy se senzitivní příznaky objeví v předloktí nebo výše.
  • Durkanův test – jde o přímý tlakový test palcem nad karpálním tunelem po dobu 30 sekund.
  • Phalenův test – provádí se setrváním ve flexi zápěstí po dobu alespoň 60 sekund.
  • Obrácený Phalenův test – jedná se o extenzi ruky v zápěstí po dobu 60 sekund.
  • Hand elevation test – pacient zvedne ruce nad hlavu po dobu 60 sekund, což vyvolá parestézie či bolest.
  • Manžetový test – provádí se nafukováním manžety tonometru, která je umístěna na zápěstí v oblasti karpálního tunelu, kdy pozitivní výsledek signalizuje rozvinutí parestézií od 30 sekund do 2 minut.
  • Turniketový test – při nafukování manžety tonometru dochází k nárůstu tlaku v karpálním tunelu a mediální nerv se dočasně nedokrvuje, přičemž manžeta bývá umístěna kraniálně od lokte a příznaky se objevují od 30 sekund do 2 minut.

Podle klinického nálezu pak lékaři rozlišují tři různá stádia syndromu karpálního tunelu. První (lehký) stupeň nemoci se pojí s přerušovanými příznaky a fyzikálně lze vybavit pouze pozitivní provokační testy či hypersenzitivitu na vibrační stimuly. Druhý (středně těžký) stupeň doprovází oslabení svalů, provokační testy jsou pozitivní a objevuje se hypertrofie svaloviny thenaru. Pro třetí (těžký) stupeň jsou typické trvalé senzitivní symptomy, výrazné zánikové symptomy či svalová atrofie.

EMG vyšetření

Pokud je nutné situaci upřesnit, verifikovat diagnózu, stanovit stupeň postižení (akutní, subakutní, chronický) nebo třeba zkontrolovat, jak se nemoc vyvíjí, lékaři používají také elektromyografii. Konkrétně jde o vyšetření motorického a senzitivního vedení mediálního nervu, což někdy doprovází také jehlová elektromyografie.

Pokud jde o to, co lze při EMG vyšetření objevit, nerv v karpálním tunelu vykazuje demyelinizační známky postižení, rychlost senzitivního vedení je snížená a motorická latence bývá prodloužená. Kromě toho si lékaři všímají obrazu disperze potenciálů a dochází také k axonopatii. Jehlová elektromyografie pak může zaznamenat reinervační potenciály a abnormální spontánní aktivitu. Výhodou je přitom možnost kvantifikace zpomalení vedení a vyjádření tíže neuropatie.

Diferenciální diagnostika

Ačkoliv může mít člověk dojem, že jeho obtíže rozhodně souvisí se syndromem karpálního tunelu, ve skutečnosti se podobné projevy mohou objevit i v případě řady dalších onemocnění. To je pak nutné zohlednit ve chvíli, kdy se lékař snaží stanovit diagnózu a určit nejlepší řešení daného problému. Pozor si musí dát třeba na záměnu s těmito chorobami:

  • polyneuropatie,
  • krční myelopatie,
  • Raynaudův syndrom,
  • stenozující tendovaginitida,
  • syndrom horní hrudní apertury,
  • syndrom pronátorového tunelu,
  • cervikální radikulopatie C6 a C7,
  • onemocnění šlach, úponů a kloubů,
  • souběh těchto diagnóz se syndromem karpálního tunelu.

Léčba karpálních tunelů

Pokud se u vás nebo u někoho z vašich blízkých rozvinul syndrom karpálního tunelu, jistě přemýšlíte, jak zmírnit nepříjemné příznaky a jaká existuje pro karpální tunel léčba. Dnes přitom máme na výběr hned několik terapeutických metod, které je možné v tomto případě využít (konzervativní i chirurgické). Konkrétní řešení však pokaždé závisí na stupni onemocnění, intenzitě jednotlivých příznaků a diagnostickém nálezu.

Konzervativní léčba karpálního tunelu

V počátečních fázích bývá postižení způsobené syndromem karpálního tunelu reverzibilní, takže je dobré začít s léčbou včas, což zabrání nevratným změnám. Včasná intervence především pomůže člověku od potíží, s nimiž se denně potýká, ale během několika měsíců může také jeho stav výrazně vylepšit nebo dokonce zcela vyléčit.

Nejdůležitější součást léčby karpálů je samozřejmě klidový režim včetně odstranění příčin, které jsou za rozvoj onemocnění zodpovědné. Pacient by měl snížit zátěž horní končetiny a omezit stereotypní pohyby na minimum. Úlevu od potíží pak mohou přinést chladivé obklady, které pomohou zmírnit otok v zápěstí. Potřebujete-li pracovat na počítači, zvolte lepší ergonomické vybavení.

Aby si mohlo pacientovo zápěstí alespoň trochu odpočinout, k dispozici jsou také různé varianty fixace, které se používají buď pouze přes noc, nebo také přes den. Jedná se především o různé ortézy, dlahy a snímatelné sádry. Tyto pomůcky by měly zajistit, že negativní vlivy, které mají problém na svědomí, nebudou nadále postižení zhoršovat. Zároveň podpoří hojení zasažené oblasti.

Podávané medikamenty:

  • vitamíny skupiny B,
  • nesteroidní antiflogistika (celkově, kombinace s lokální terapií),
  • obstřik s aplikací anestetik, steroidů či antirevmatik.

Další velice důležitou součástí léčby je samozřejmě fyzioterapie nebo pooperační terapie, která pomáhá pacientovi ulevit od potíží. Nejčastěji se využívají techniky měkkých tkání, dále pak míčkování, protahování svalů ruky, zápěstí, předloktí, ramene a šíje, masáže či mobilizace drobných kloubů ruky, karpálních kůstek a dalších kloubů.

Nejen že pomáhá na syndrom karpálního tunelu cvičení, ale zbavit pacienta bolesti i dalších nepříjemných projevů mohou také jiné léčebné metody. Sem patří například terapie rázovou vlnou, ultrazvuk, laser, magnetoterapie, hydroterapie, galvanoterapie či iontoforéza. Pokud je ovšem na vině jiné onemocnění, lékař by měl v první řadě řešit tento problém.

Operace karpálních tunelů

Ačkoliv v některých případech konzervativní léčba pomůže natolik, že již není nutné situaci dále řešit, středně těžký či těžký syndrom karpálního tunelu obvykle vyžaduje léčbu chirurgickou. To samé pak platí v případě, kdy se pacient sice potýká s lehčí variantou onemocnění, ale konzervativní metody na jeho stav zkrátka nefungují nebo mu příznaky znepříjemňují každodenní život.

Pokud klinický nález napovídá, že je situace vážná, je nutné, aby pacient podstoupil operaci. Jejím cílem je dekomprese nervu pomocí discize ligamentum carpi transverzum. Toto uvolnění nervu se přitom provádí například pomocí otevřeného zákroku. O něco častěji však lékaři přistupují k endoskopické operaci karpálního tunelu, která se pojí s rychlejší rekonvalescencí i menší bolestivostí a nezpůsobuje vznik jizvy.

Operace karpálních tunelů se většinou provádí ambulantně v místním znecitlivění. Podle lékařů je úspěšná až v 90 % případů, přičemž první pocity úlevy obvykle přichází zhruba po dvou dnech. Funkce horní končetiny se pak stabilizuje během několika týdnů nebo maximálně měsíců, ale pacient by neměl ruku plně zatěžovat dříve, než uplynou 3 měsíce od operace.

Pooperační režim zahrnuje řadu opatření, která by měl pacient striktně dodržovat. Je samozřejmě důležité udržovat ránu v suchu a čistotě, procvičovat hybnost prstů i zápěstí a pečovat o jizvu i po vyndání stehů. Kromě toho se doporučuje znehybnění ruky obvazem nebo dlahou, nošení ortézy v noci, polohování, manuální lymfodrenáž a provádění mobilizačních, posilovacích i relaxačních cviků.

Ačkoliv bývá operace karpálních tunelů většinou úspěšná, samozřejmě se v některých případech neobejde bez komplikací. K těm patří například strukturální poškození nebo jizevnaté změny, ale pacienti mohou pociťovat také bolest po operaci karpálního tunelu v zápěstí nebo v jizvě, úbytek svalové síly v ruce, rozvoj infekce nebo třeba pooperační hematom.

Babské rady na syndrom karpálního tunelu

Chtěli byste si od potíží ulevit vlastními silami? V tom případě mějte na paměti, že pokud zaznamenáte některé z příznaků tohoto onemocnění, měli byste vždy nejprve vyhledat lékaře a svou situaci s ním zkonzultovat. Jinak by se mohlo stát, že se postupem času váš zdravotní stav zhorší natolik, že dojde k výraznému zhoršení jemné motoriky a objeví se i další závažné obtíže.

Pokud si ovšem kromě léčby chcete ulevit od bolesti přírodní cestou, vyzkoušet můžete třeba měsíčkový olej nebo konopnou mast, které se lokálně aplikují na zasaženou oblast. Dále mohou pomoci studené obklady a pozitivní vliv mívá i konzumace potravin s vitamínem B6 či bromelinem.

Prevence

Máte-li strach, že by syndrom karpálního tunelu mohl postihnout i vás, zaměřte se v první řadě na možnosti prevence. Pokud například denně pracujete s počítačem, informujte se o správné ergonomii pracovního prostředí. Kromě toho si můžete pořídit také řadu pomůcek, které by vás měly před tímto onemocněním ochránit. Sem patří vertikální počítačová myš, speciální podložky pod zápěstí a hlavně pohodlná židle, která zajistí, že budete sedět správně.

Jestliže se vaše profese pojí s výkonem náročných fyzických aktivit, vždy se řiďte bezpečnostními pokyny a používejte předepsané pomůcky. Také si dělejte krátké, ale časté přestávky a pracovní úkoly průběžně střídejte, abyste se vyhnuli monotónnímu zatěžování zápěstí. Vhodné je pak i pravidelné protahování a člověk by měl myslet také na dostatečný odpočinek, správné držení těla a udržování zápěstí v teple.

Zdroje: orthoinfo.aaos.org, my.clevelandclinic.org, internimedicina.cz, neurologiepropraxi.cz, neurologiepropraxi.cz, wikiskripta.eu, solen.cz, dspace5.zcu.cz

'; 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'; } }
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).
'; 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 »