Aplikace připomene, kdy vyrazit na prohlídku k doktorovi. Lidé díky ní odhalili i rakovinu

15. 3. 2023

Sdílet

Autor: Depositphotos
Češi zanedbávají preventivní prohlídky. Často ani nevědí, na jaké mají nárok. To je známý fakt. S orientací v systému prohlídek a také s jejich připomínáním pomáhá aplikace Preventivka. Kromě upozornění, že je čas vyrazit k lékaři, nabízí také návod na samovyšetření prsu a kůže nebo mapu specialistů.

Preventivní prohlídky zanedbává až 75 procent Čechů. Přitom díky nim mohou lékaři objevit nemoci, kterými člověk trpí, ještě v bezpříznakovém stadiu. To může znamenat nejen dřívější nasazení léčby, ale v konečném důsledku i záchranu života.

„Účast na preventivních prohlídkách u praktického lékaře je poloviční, než by být měla. Jen o málo vyšší je tomu u preventivní prohlídky u gynekologa (56 %). Na mamografické screeningové vyšetření chodí necelých 60 % žen a jen 27 % klientů VZP absolvuje screening kolorekta,“ popisuje Ivan Duškov, náměstek ředitele Všeobecné zdravotní pojišťovny pro služby klientům. 

Na preventivní prohlídky chodí jen třetina Čechů. Často nevědí, na co mají nárok Přečtěte si také:

Na preventivní prohlídky chodí jen třetina Čechů. Často nevědí, na co mají nárok

To potvrzuje také index prosperity, který zahrnuje finance, vzdálenost a čekací dobu, podle kterého má Česká republika 5. nejdostupnější péči„Stále ji však málo lidí využívá právě pro prevenci. Nejčastěji slýcháme argumenty typu ‚nemám čas‘, ‚jsem mladý, rakovina mi nehrozí‘ či ‚nic mi není, proč bych měl chodit k lékaři‘, které však nemohou být dále od reality. Za nízkou návštěvnost screeningových programů a preventivních prohlídek totiž může kromě jiného i nízká zdravotní gramotnost, kdy pouze 40 procent Čechů umí informace získat, pochopit a využít ke zlepšení svého zdraví,“ doplňuje lékařka a ředitelka neziskové organizace Loono Kateřina Šédová.

Aplikace má odbourat strach z lékařů

A právě Loono stojí za aplikací Preventivka, která Čechům už od podzimu s prevencí pomáhá. „Chceme Čechy naučit chodit na preventivní prohlídky a poskytnout jim komplexní, ověřené a srozumitelné informace, které pomohou žít zdravější a kvalitnější život. Nechceme, aby si lidé hledali diagnózy na internetu a báli se chodit k doktorům. Naprostá většina vyšetření vůbec nebolí, je ale v péči o zdraví naprosto klíčová,“ přibližuje funkce aplikace Šédová.

„Chceme také zvýšit návštěvnost screeningových programů, jako je mamograf, screening děložního čípku, tlustého střeva a plic. Dnes na ně chodí jen polovina Čechů, kterých se týkají,“ dodává. 

Preventivka tak uživatelům vyfiltruje všechny důležité prohlídky a připomene jejich termíny a vysvětlí, proč jsou tyto prohlídky důležité a co na nich člověka čeká.

Díky aplikaci si 19 lidí odhalilo nádor

„Prevence a včasná diagnóza může zachránit život každému z nás. Ostatně se o tom přesvědčujeme každým dnem, kdy dostáváme zpětnou vazbu, že si díky nám lidé objevili vážné onemocnění včas. Do konce února si díky aplikaci naplánovalo dříve zanedbávanou prohlídku přes čtyři tisíce uživatelů, 19 si díky Preventivce odhalilo zhoubný nádor,“ uvedla pro server Vitalia.cz Adéla Sedláčková, Product Owner Preventivky, s tím, že celkem už aplikaci začalo používat na třicet tisíc lidí.

Aplikace je uživatelsky velmi jednoduchá a příjemná. Jakmile vyplníte, že jste v posledních dvou letech byli na prohlídce u svého praktika, získáte kupříkladu plášť pro superhrdinu. Stejně tak získáte třeba čelenku od zubaře a ženy pak pásek od gynekologa nebo top z mamografu. Přidat si můžete i návštěvy u dalších specialistů, jako je například alergolog, očař, endokrinolog či zubní hygiena.

K tomu každý uživatel dostává body a může si pak porovnat s ostatními, jak na tom s prevencí je. Jde tak o velmi hravý způsob, jak uživatele motivovat k návštěvám lékaře.

Nicméně Preventivka má i řadu dalších funkcí. Obsahuje seznam a mapu specialistů s kontakty, dále také (video)návod na samovyšetření prsu a kůže, návody pro první pomoc i články o nejrůznějších zdravotních tématech.

Co Preventivka umí?

  • Ukáže, na jaké preventivní prohlídky by měl uživatel chodit, pohlídá jejich termíny a přiblíží, co od nich očekávat.
  • Uživatel si může přidat i vlastní prohlídky u dalších specialistů (například na alergologii, endokrinologii, dentální hygieně apod.).
  • Připomene samovyšetření prsou, varlat i kůže a nabídne podrobné návody.
  • Vyhledá specialisty v okolí uživatele.
  • Nabízí ověřené a srozumitelné informace o prevenci závažných nemocí na jednom místě.

Aplikace se brzy dočká i vylepšení. „Provede očkováním, ukáže mapu testovacích míst na HIV, rozšíří svůj edukační obsah i cílovou skupinu. Preventivka, která je nyní určena lidem od 18 let, se zaměří i na uživatele od 15. roku věku. Podporu Loono využije také k rozšíření aplikace do regionů,“ popsala Adéla Sedláčková.

„Chceme, aby se stala zdravotním deníkem pro hlídání zdraví každého z nás. To znamená včetně očkování a rodinné anamnézy. Aplikace by měla své uživatele vzdělávat o tom, jak žít zdravější a kvalitnější život. Plánů máme spoustu, takže se mají uživatelé určitě na co těšit,“ uzavírá Kateřina Šédová.

Aplikace vás nic nestojí

Preventivka je k dispozici zdarma. Zájemci si ji mohou stáhnout jak pro iOS, tak pro Android. První verze aplikace vznikla za podpory Nadace PPF. Vývoj nových funkcionalit a tvorbu edukačního obsahu podpořilo také Ministerstvo zdravotnictví a pražský magistrát.  

„Zlepšení prevence v České republice je jedním z mých hlavních cílů, kterých chci dosáhnout. Jako lékař totiž moc dobře vím, kolika těžkým případům nejrůznějších onemocnění by předešly pravidelné preventivní prohlídky, které by je zachytily v počáteční fázi. Tato aplikace je skvělým přínosem k tomuto úsilí a já děkuji všem, kteří se zapojili do jejího vývoje,“ řekl ministr zdravotnictví Vlastimil Válek.

Kam volat, když máte zdravotní potíže a nevíte, jestli to je na praktika, či záchranku Přečtěte si také:

Kam volat, když máte zdravotní potíže a nevíte, jestli to je na praktika, či záchranku

Na jaké preventivní prohlídky mají pacienti nárok?

Ženy by měly každé dva roky absolvovat preventivní prohlídku u svého praktického doktora, alespoň jednou ročně u zubaře a jednou ročně u gynekologa. Během této prohlídky probíhá také screening rakoviny děložního čípku, který se provádí pomocí cytologického stěru. Jednou ročně mohou navštívit také očního lékaře a dermatologa.

V rámci prevence rakoviny prsu by měla žena po 45. roce zajít každé dva roky na mamografický screening. Vyšetřit se může nechat ale i dříve. Do 40 let věku se obvykle využívá ultrazvukové vyšetření.

Chodíte na preventivní prohlídky?

Od 50 let chodí ženy také na screening rakoviny tlustého střeva a konečníku, který se provádí buď jednou ročně (od 55 let dvakrát) pomocí testu okultního, tedy skrytého, na krvácení do stolice (TOKS), nebo jednou za deset let pomocí koloskopie. Od 55 let dál mohou být kuřačky, které denně vykouří 20 a více cigaret, vybrány také pro screening rakoviny plic. 

Muži by měli také docházet jednou za dva roky ke svému praktickému lékaři a alespoň jednou ročně k zubaři. Jednou ročně mohou absolvovat také preventivní prohlídku u očního lékaře a dermatologa. Po 50. roku věku by měli poprvé navštívit urologa.

Stejně jako ženy by pak měli od 50 let chodit na screening rakoviny tlustého střeva a konečníku a od 55 let je může praktický lékař vytipovat pro screening rakoviny plic.

Loono je týmem mladých lékařů, studentů medicíny a dalších profesionálů, kteří věří, že by se neměli pacienti pouze léčit, ale vést k prevenci nejrůznějších onemocnění. V minulosti odstartovalo kampaň za prevenci onkologických (#prsakoule) a kardiovaskulárních onemocnění (#zijessrdcem) i reprodukčního (#doledobry) a duševního zdraví (#dobrenitro). Během 8 let své existence Loono zrealizovalo více než 3500 workshopů, na kterých vyškolilo přes 130 tisíc lidí.

Autor článku

Redaktorka serveru Vitalia.cz. Zaměřuje se především na zdravý životní styl, pohyb a zdraví dětí. Mimo novinařinu pracuje také jako lektorka pohybových kurzů pro děti a rodiče.

'; 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 »