Petechie mohou mít řadu příčin. Jak je bezpečně poznáte?

2. 5. 2025 10:00
11 nových názorů
ručitel
MUDr. Daniel Petr | Odborný garant článku
„Při opakovaném výskytu petechií bez traumatických příčin vyhledejte lékaře.“

Petechie jsou drobné krevní výronky do kůže, které vznikají vlivem narušení celistvosti podkožních krevních cév. Mohou se objevit na pokožce, ale také na sliznicích či serózních membránách. Ačkoliv často bývají způsobené fyzickými příčinami, jako je škrábání, silný kašel nebo třeba tlačení během porodu, v některých případech také signalizují velice vážná onemocnění. Z toho důvodu je při jejich výsevu vždy lepší vyhledat lékaře. 

Co jsou petechie?

Petechie vypadají jako drobné nafialovělé a červené tečky, které mohou vzniknout kdekoliv na kůži nebo také na sliznicích. Jejich velikost se pohybuje od zcela nepatrných skvrn až do tří milimetrů. Dalším typickým znakem petechií je, že tyto drobné krevní výronky nevystupují nad povrch kůže a po stlačení nikdy neblednou.

Jak poznat petechie? Tyto fialové a červené fleky na kůži, které mohou v některých případech připomínat modřiny, se mohou vyskytnout prakticky kdekoliv po celém těle. Ačkoli se nejvíce objevují petechie na dolních končetinách a na předloktí, lidé si často stěžují také na tyto problémy:

  • petechie na obličeji,
  • petechie v ústech,
  • petechie na patře,
  • petechie kolem očí,
  • petechie na dlani,
  • petechie na břiše,
  • petechie na hrudi.

Petechie na kůži se často projevují také v podobě purpury, což je mnohačetné tečkování na kůži, a někdy může dojít i k rozsáhlejšímu splývajícímu krvácení, které se označuje jako sufuzeU purpury se petechie mohou vyskytovat jednotlivě, případně mohou mírně splývat, ale nikdy není postižení kůže plošné. V případě sufuze se dá mluvit o plošném podkožním krvácení, kdy vznikají modřiny a krevní výrony nepravidelného tvaru. [1, 2, 3, 4, 5]

Objevily se u vás někdy petechie?

Jaké mají petechie příčiny?

Vznik petechií může být způsoben mnoha různými příčinami, od banálnějších až po ty velice závažné. V zásadě se ale vždy jedná o narušení celistvosti kapilár, což jsou drobné podkožní cévy. U zdravého člověka mohou petechie na obličeji vzniknout například při místním zvýšení tlaku, a to vlivem pláče, neustávajícího kašle, alergické reakce, usilovného zvracení nebo také tlačení během porodu.

Co se týče fyzikálních příčin, petechie mohou vzniknout vlivem mechanické síly, přetlaku či podtlaku na kůži. U člověka, který je vystaven nějakému násilí, totiž drobné cévy na daném místě popraskají a následně se objeví drobné krevní výronky. Zatímco petechie na rukou a petechie na nohou mohou vzniknout úderem či nárazem, na krku se objevují třeba po škrcení. Výjimkou nejsou ani petechie po škrábání těla.

Fialovočervené krevní výronky mohou být také známkou těžkého septického stavu a poměrně často signalizují infekční choroby. Další příčiny vzniku petechií zahrnují například:

  • nedostatek vitamínu C,
  • nízký počet krevních destiček (trombocytopenie),
  • hematologické choroby, jako jsou lymfomy, leukémie či aplastická anémie,
  • zánětlivá onemocnění cév (vaskulitidy),
  • virové a bakteriální infekce,
  • vysoké dávky přípravků na ředění krve (antikoagulační léky),
  • onemocnění imunitního systému (lupus erythematodes),
  • virové hemorhagické horečky – dengue, ebola, žlutá zimnice.

Petechie u dětí mohou vzniknout v důsledku zcela banální virózy, ale někdy také signalizují závažné onemocnění. Z toho důvodu není dobré přítomnost těchto drobných krevních výronků podceňovat. Nejčastější zánětlivé onemocnění cév u dětí spojené s přítomností petechií je Henochova-Schönleinova purpura. Drobné petechie se však mohou objevit také u meningokokové infekce, mononukleózy, spály nebo infekčního zánětu srdečního svalu. [6, 7, 8, 9, 10, 11]

Další projevy

Kromě symptomů, které se u pacientů typicky objevují, což jsou drobné fialové nebo červené tečky na pokožce (kdekoliv na kůži), se u pacienta může rozvinout také řada dalších příznaků.

Pokud petechie nemají vnější fyzikální příčiny, ale jsou způsobeny některým závažnějším onemocněním, mohou se společně s nimi projevit také další doprovodné příznaky těchto chorob. V případě leukémie (laicky rakovina krve) to je například únava, pocení, nechutenství nebo chudokrevnost.

Pokud petechie způsobil lupus erythematodes, což je závažné autoimunitní onemocnění postihující hlavně ženy, symptomy zahrnují také bolest kloubů, padání vlasů či světloplachost. U zánětu krevních cév (odborně vaskulitida) se objeví skvrny pod nehty, teploty, celková únava, slabost, bolest svalů či kloubů nebo třeba krev v moči.

Lupus se špatně diagnostikuje i léčí. Jaké jsou jeho příznaky?
Přečtěte si také:

Lupus se špatně diagnostikuje i léčí. Jaké jsou jeho příznaky?

Tardieuovy skvrny

Jako Tardieuovy petechie či skvrny se označují tečkovité krevní výronky, které se objeví pod poplicnicemi a pohrudnicí, pokud dojde k mechanickému dušení. Mají význam hlavně pro soudní lékaře při pitvě zemřelých z neobjasněných příčin.

Jejich výskyt může sloužit jako důkaz, že na zesnulého byl vyvíjen vnější tlak či síla, a tedy podporovat hypotézu o udušení jako příčině smrti. Zároveň mohou Tardiueovy skvrny přispět ke stanovení velikosti síly, která byla při škrcení použita. Jejich vyšší množství totiž obvykle svědčí o větší síle, kterou bylo nutno vyvinout. 

Tento specifický typ je třeba odlišovat od zbylých typů petechií, které bývají vyvolány jinými příčinami, například v důsledku zdravotních potíží nebo jako reakce na jisté léky. Ještě doplňme, že svůj název získaly po Augusteovi Ambroiseovi Tardieuovi, známém francouzském lékaři.

Komplikace

Jestliže se petechie na těle objevily v důsledku poranění, silného kašle nebo jiné vnější příčiny, měly by samy od sebe zmizet bez jakýchkoliv trvalejších následků. Pokud jsou však příznakem závažnějšího onemocnění, může dojít ke komplikacím, jako jsou například:

  • potíže se srdcem – arytmie, infarkt myokardu,
  • selhání ledvin,
  • poškození jater, sleziny, plic a dalších orgánů,
  • rozšíření infekce do dalších částí těla. [12, 13, 14, 15, 16, 17, 18, 19]

Léčba petechií

Pacienti se často ptají, jak se zbavit petechií, za jak dlouho zmizí petechie a kdy je nutné vyhledat lékaře. Ať už vás trápí červené tečky v puse, petechie na nohách nebo třeba drobné fialové skvrny na břiše a na hrudi, důležité je tyto komplikace nepodceňovat, a pokud si nejste jistí, z jakého důvodu se na vašem těle vyskytly, raději se vždy poradit s odborníkem.

Petechie, které se na těle či na sliznicích objevily bez jasné vnější fyzikální příčiny, by měl vždy vyšetřit lékař. Mohou být totiž předzvěstí či doprovodným příznakem nějakého závažného onemocnění. Pokud navíc na těle neustále přibývají nové krevní výronky, začínají se slévat do větších skvrn a doprovází je další nepříjemné zdravotní příznaky (prudké bolesti hlavy, horečky, světloplachost), může se jednat o počínající meningokokovou sepsi a je nutné okamžitě zavolat záchranku.

Kvíz: Co víte o lidské kůži?
Přečtěte si také:

Kvíz: Co víte o lidské kůži?

Jaká platí na petechie léčba? Aby mohl lékař zvolit vhodnou terapii, nejprve musí správně odhalit příčinu, která vznik petechií vyvolala. Jestliže se krevní výronky objevily v důsledku užívání nějakých léků, pacienti obvykle musí tyto přípravky vysadit a místo nich jim lékař doporučí jiné, které nemají tyto nežádoucí účinky.

Petechie způsobené virovou či bakteriální infekcí by měly odeznít ve chvíli, kdy se podaří dané onemocnění vyléčit. Mezi předepisované léky patří například antibiotika, přípravky na potlačení imunitního systému, léky proti bolesti nebo také kortikosteroidy a důležitý je samozřejmě i odpočinek a dostatek tekutin. Samotná léčba ale vždy závisí na konkrétní příčině. [20, 21, 22, 23, 24]

Petechie foto

Zdroje: stefajir.cz, rehabilitace.info, cs.medlicker.com, wikiskripta.eu, healthline.com, my.clevelandclinic.org, medicalnewstoday.com, verywellhealth.com, webmd.com, ncbi.nlm.nih.gov, nzip.cz, forensicsdigest.com, forensicspedia.com

beruska (neregistrovaný)

Manželovi se udělal pod krkem flek jako po štípnutí , následně mu otekl, během chvíle se mu udělali 2 flíčky pod paží , taky otekli , uprostřed flíčku bílá tečka ,další na hrudi , na kterém se mu po dvou dnech udělala na tom místě na hrudi , černá tečka o průměru půl cm. Je onkologický pacient , prodělal rakovinu močového měchýře , který mu následně odstranili. Má umělý vývod. Prosím pokud to bude možné , poraďte.
Děkuji za odpověď.

Dobrý den,
dle vašeho popisu takto těžko říci. Může se jednat téměř o cokoliv. Chtělo by to fyzikální vyšetření.
Vzhledem k tomu, že je váš manžel onkologický pacient, určitě doporučuji návštěvu praktického lékaře, který manžela vyšetří, případně pošle k dalším odborníkům.

javor (neregistrovaný)

y r 2012 jsem při zájezdu do Itálie, …každý den dlouhé chození, vyšel na vrchol Vesuvu a pak opět sešel dolů. Dost námaha.
Druhý den jsem zesinal, neb tato vínová krupička mi obalila lýtka od kolen až po prsty.
Lékař navrhl počkat a vzít si oddech
Během týdne se to ztratilo.

MUDr. Thai Bao Han (neregistrovaný)
Dobrý den, co nejdříve vyšetření u lékaře, buď praktického či kožního. Podle nálezu případně odběry a další vyšetření, terapie.
  • 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 »