Včasná diagnostika cystické fibrózy může prodloužit život. Jak smrtelnou nemoc odhalit?

19. 7. 2019 9:00
7 nových názorů

Cystická fibróza je nevyléčitelné dědičné onemocnění, které postihuje převážně dýchací a trávicí ústrojí. Nemoc není nakažlivá a zpravidla se projevuje už v novorozeneckém věku. Pacienti trpí opakovanými infekcemi dýchacích cest, špatně tráví potravu a objevují se u nich komplikace v podobě cukrovky a cirhózy jater. Polovina z nich momentálně umírá kolem věku 37 let. Co je to cystická fibróza? Jedná se o nevyléčitelnou nemoc, která je způsobená mutací genu CFTR, který řídí činnost takzvaného chloridového kanálku v membráně buněk. Zásadní roli hraje dědičnost. Nemoc tudíž není nakažlivá, pacient se s ní již narodí. Aby se tak stalo, musí se setkat dva zdraví nositelé mutace genu. Tím je v současnosti každý 27. člověk. Nemoc jako taková se pak ročně rozvine u 2 500 až 4000 jedinců s tím, že první příznaky nemoci se obvykle objeví v horizontu několika měsíců či let po narození. I přes zdokonalující se léčebné metody je onemocnění stále nevyléčitelné. Momentálně se polovina pacientů dožívá zhruba 37 let. Délka života se však neustále prodlužuje a stejně tak i jeho kvalita.



Příznaky cystické fibrózy

Cystická fibróza se projevuje opakovanými infekcemi dýchacích cest, jejichž častý výskyt má za následek poškození plic. V dýchacích cestách nemocného vzniká hustý hlen, který tvoří ideální prostředí pro bakterie a nečistoty. Hustý hlen navíc ztěžuje dýchaní a zamezuje plicím zbavovat se nečistot a nahromaděných bakterií.

Plíce bývají často osídleny jen bakteriemi, které jsou typické pro toto onemocnění. A zatímco pro zdravého člověka pacienti nepředstavují žádnou hrozbu, s jinými nemocnými cystickou fibrózou se stýkat nesmějí. Mohli by se těmito bakteriemi vzájemně nakazit, což by mohl být problém, jelikož na tyto bakterie velice špatně účinkují antibiotika.

Nemocní cystickou fibrózou špatně tráví, a to až v 85 procentech případů. I přesto, že hodně jedí, neprospívají a nepřibývají na váze. Jejich stolice je velmi mastná a má velký objem. Pot je u nemocných asi pětkrát slanější než u zdravého člověka. Zejména pak v létě, kdy se lidé více potí, se u nemocného mohou na kůži objevovat bílé krystalky soli.

Onemocnění navíc často doprovázejí i různé komplikace. Cystická fibróza u dospělých mužů zpravidla zapříčiňuje neplodnost, která se vyskytuje asi v 98 procentech případů. U žen se plodnost odvíjí od jejich zdravotního stavu. Dalšími možnými komplikacemi jsou:

Cystická fibróza u dětí

Cystická fibróza je zpravidla diagnostikovaná v dětském věku, a to konkrétně jen několik měsíců od narození. Nějakou dobu proto funguje takzvaný novorozenecký screening, který dokáže odhalit vrozené vady těsně po narození. Pomocí kapičky krve odebrané z patičky kojence lze cystickou fibrózu diagnostikovat ještě předtím, než se u dítěte objeví první příznaky.

Okamžité zahájení léčby může navíc pacientovi znatelně zlepšit kvalitu života a také prodloužit jeho délku. Udává se, že současné děti narozené s cystickou fibrózou mají šanci dožití 40 až 50 let. Mutace genu, kterých je asi 1700 se v některých případech mohou projevit až v pozdějším dětském věku, zpravidla to ale bývá po narození.

Kromě screeningového vyšetření napoví maminkám nemocných dětí také slaný dětský pot. Po políbení dětské hlavičky totiž na rtech ulpívá slaná chuť. Právě z toho důvodu se cystická fibróza označuje za nemoc slaných dětí. Dalším varovným signálem bývá objemná, velmi mastná a nezdravě zapáchající stolice.

Léčba

Jelikož se jedná o nevyléčitelné onemocnění, soustředí se léčba pouze na tlumení příznaků, zpomalení průběhu nemoci a zamezení komplikacím. V první řadě je důležité zajistit dobrou průchodnost dýchacích cest. Nemocní tak musejí několikrát denně inhalovat a provádět dechovou rehabilitaci, pomocí těchto činností se hustý hlen ředí a tím pádem se i lépe dostává ven z plic. Při větších problémech s dýcháním lze také nasadit terapii kyslíkem, v krajním případě se pak přistupuje k transplantaci plic.

Pacientům jsou bezprostředně po diagnostice nasazena antibiotika, která nemocní vzhledem k častým infekcím konzumují velmi často, a to i v případě slabší virózy, s kterou by si imunitní systém zdravého člověka bez problémů poradil.

Důležitá je také úprava jídelníčku. Spousta nemocných mívá postiženou slinivku, je tedy nutné do těla dostávat trávicí enzymy jinou cestou. Dalším řešením trávicích obtíží bývá vysokokalorická strava. Ta by měla obsahovat o přibližně 30 až 50 procent více energie než potrava určená pro zdravého jedince. Pro nemocné je zásadní dostatečný příjem vitamínů A, D a E.

Velkou roli hraje při léčbě nemoci také psychika. Pacienti i jejich blízcí proto mohou využít služby Klubu nemocných cystickou fibrózou či jiných neziskovek, které kromě sociálního poradenství poskytují také podporu psychologa.

Kvalita a délka života

Člověk s cystickou fibrózou je víceméně schopný žít velmi podobný život jako zdravý jedinec. Záleží však na aktuálním zdravotním stavu. Pacienti se navíc nevyhnou obrovské časové zátěži a disciplíně, jejíž součástí jsou přísná hygienická opatření. Nemocní se například nesmějí:

  • Koupat ve stojatých vodách
  • Pohybovat se v blízkosti těchto vod nebo louží
  • Sedět v blízkosti květináčů s hlínou
  • Mazat tabuli ve škole
  • Použít veřejnou toaletu bez toho, aniž by ji těsně předtím někdo důkladně umyl savem

Kromě ideálních podmínek pro bakterie v dýchacím systému pacientů je problémem také oslabená imunita z důsledku častého užívání antibiotik. Nemocní tak bývají často hospitalizováni a léčeni v nemocnici kvůli virózám. Vzhledem k problémům s trávením musejí navíc před každým jídlem polykat již zmíněné trávicí enzymy.

Přestože jsou tito lidé vážně nemocní, paradoxně vypadají na první pohled zdravě. Zvláště pak děti školního věku se proto mohou dostávat do konfliktu s učiteli, kteří mají pocit, že si malý pacient svá omezení jen vymýšlí nebo přehání.

Co se týče dožití, momentálně se jako hranice udává věk 37 let, a to přibližně u poloviny případů. Léčebné metody se ale neustále zdokonalují, a tak se dá čekat, že tato hranice i nadále poroste.

Prevence

Z toho důvodu, že se jedná o dědičné onemocnění, nedokáže pacient nákazu předem ovlivnit. A jelikož se lidé s cystickou fibrózou rodí vždy dvěma zdravým nosičům zmutovaného genu, jedinou prevenci představuje genetické vyšetření, které bude oběma partnerům provedeno ještě před početím a vyloučí je jako přenašeče postiženého genu CFTR.

Iveta Kleckova (neregistrovaný)
Dobrý den, dnes mi 30letý syn řekl, že ma cystickou fibrozu, byly se zenou na genetice, jelikoz 2xpotratila a tam mu to zjistili. Je to mozne, kdyz nikdo z me ani manzelovy strany nikdy nic takoveho nemel a kdyby nesel na genetiku, tak to nevi dodnes. Je mozne, aby mu ji zjistili ve 30letech? Dekuji
MUDr. Thai Bao Han (neregistrovaný)
Dobrý den, bohužel neplodnost způsobená nepřítomností spermií v ejakulátu může být jediným příznakem u některých mutací cystické fibrózy. Zjistí se proto až v dospělosti (pokud nejsou přítomny respirační, gastrointestinální příznaky, paličkovité prsty, v dětství neprospívání, atd..)
Marcela (neregistrovaný)

Dobrý den,u nás se stalo to stejné.Syn byl na spermiogramu kde mu zjistili nepohyblivost spermií.Na klinice reprodukční medicíny po genetickém vyšetření mu byla diagnostikována cystická fibroza.Bylo mu 38 let.Do této doby jsme neměli nikdo ani tušení,že trpí touhle chorobou.Nemocný nebýval,pouze běžně jako malé děti do tří let.Nyní má 45 let a nemoc se mu začíná víc projevovat.Opa­kované záněty průdušek a taky problémy se slinivkou.

Magdalena Moravcova (neregistrovaný)
Dobrý den.Mám dotaz. Ohrožuje člověka s cystickou fibrozou kouř z cigerety z balkonu pod námi. Soused pod námi si občas zakouří na balkoně. Děkuji za zprávu.
  • 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 »