Zvracení krve byste rozhodně neměli podceňovat. Příčina může být banální i život ohrožující

28. 5. 2024 7:30
přidejte názor
Autor: Depositphotos/AndreyPopov

Pokud vás trápí zvracení jasně červené krve nebo jste objevili příměs natrávené krve ve zvratcích, je to samozřejmě důvod k obavám. Ačkoliv může být tento stav způsoben drobným poraněním v ústech nebo krvácením z nosu, na vině mnohdy bývají i závažnější zdravotní problémy včetně rakoviny. Dostaví-li se zároveň motání hlavy, dušnost nebo tachykardie, je načase zavolat záchranku.

Co je hemateméza?

Co se dozvíte v článku
  1. Co je hemateméza?
  2. Jaké má zvracení krve příčiny?
  3. Doprovodné příznaky
  4. Zvracení krve v těhotenství
  5. Možné komplikace
  6. Diagnostika
  7. Léčba hematemézy

Hemateméza je odborný termín, který označuje situace, kdy u pacienta dochází ke zvracení krve nebo objeví příměs krve ve zvratcích. Jedná se o příznak řady závažných zdravotních problémů spojených především s krvácením do horního trávicího traktu (krvácení z horní části GIT). Obecně pak rozlišujeme dva typy obtíží, které vypadají následovně:

  • zvracení čerstvé krve – má světle nebo tmavě červenou barvu,
  • zvracení černé krve (natrávené) – její vzhled připomíná kávovou sedlinu.

Pokud pacient zaznamená zvracení s příměsí krve, měl by co nejdříve kontaktovat svého ošetřujícího lékaře. Kromě toho se pak může krev dostat skrze žaludek také do střev, kde se stává součástí stolice. Proto si můžete současně všimnout černé a nepříjemně páchnoucí krve ve stolici, která je natrávená. Ta se odborně označuje jako meléna.

Zvracení krve může být pak mimo jiné doprovázeno také vykašláváním nebo pliváním krve (hemoptoe), jelikož určité množství této životně důležité tekutiny někdy zatéká do dýchacích cest a pacientův organismus se jí zbavuje právě prostřednictvím kašle. Krev z dýchacích cest se ovšem stejně tak může dostat do žaludku, což vyvolá nevolnost a následné zvracení s krví. [1, 2, 3, 45]

Jaké má zvracení krve příčiny?

Pokud člověk zvrací krev, může se jednat například o důsledek poranění v ústní dutině nebo v oblasti nosohltanu (vlivem nadměrného kašlání či jiných potíží). Mnohem častěji však bývá hemateméza příznakem krvácení do horní části gastrointestinálního traktu, které se pojí s různými chorobami jícnu, žaludku nebo dvanáctníku (počáteční část tenkého střeva).

Zvracení krve nikdy není normální, takže byste měli lékaře vyhledat i v případě, kdy se objeví pouze malé množství této tekutiny. Ačkoliv na vině může být například poranění úst nebo jednoduše opakované zvracení, které je pro organismus velkou zátěží, existují i mnohem závažnější příčiny včetně vnitřního krvácení a prasknutí některého orgánu. Situaci tedy nikdy nepodceňujte.

Možné příčiny hematemézy:

  • žaludeční a dvanáctníkové vředy (peptické vředy) – tento problém, který se rozvíjí hlavně vlivem působení infekčních činitelů (například Helicobacter pylori) nebo užívání nesteroidních antirevmatik, je poměrně častým důvodem zvracení krve (například při prasknutí vředu), přičemž způsobuje také přítomnost krve ve stolici,
  • jícnové varixy – objevují se jako komplikace dlouhotrvající portální hypertenze a jaterní cirhózy, přičemž jakmile potom tyto zvětšené cévy prasknou, krev se vyhrne do jícnu a člověk ji spolkne, nebo naopak vyzvrátí ven, což může být velmi závažné,
  • zánětlivá onemocnění (akutní i chronická) – sem patří například zánět žaludeční sliznice (gastritida), zánět jícnu (ezofagitida) nebo zánět slinivky břišní (pankreatitida),
  • refluxní choroba jícnu – jedná se o nemoc způsobenou nadměrným gastroezofageálním refluxem (návrat žaludečního obsahu do jícnu), což může mít na svědomí poškození sliznice jícnu (refluxní ezofagitida),
  • Mallory-Weissův syndrom – jde o důsledek opakovaného zvracení (často po alkoholu), kdy se na sliznici jícnu postupně začnou objevovat podélné trhliny a dochází ke krvácení (krev ve zvratcích připomíná kávovou sedlinu),
  • nádorová onemocnění – kromě výše zmiňovaných příčin může způsobit zvracení krve rakovina (například žaludku, jícnu nebo slinivky břišní), přičemž za hematemézu bývají zodpovědné maligní, ale i benigní nádory,
  • angiodysplazie – tento termín označuje cévní malformace v trávicí trubici (v žaludku, tenkém a tlustém střevě), které mohou mít na svědomí krvácení,
  • poruchy srážlivosti krve – může se jednat například o vrozené stavy, jako je hemofilie, ale za rozvoj potíží bývají zodpovědné také užívané léky (některé medikamenty na ředění krve),
  • traumatické poranění – v tomto případě se zvracení krve objevuje hlavně v důsledku přímého, tupého poranění v oblasti žaludku nebo jícnu, což vede k akutnímu vnitřnímu krvácení, ale na vině někdy bývá také lékařský zákrok,
  • krvácení z nosu, úst, hrtanu nebo hltanu – krev může v takovém případě zatékat do trávicí trubice, a když jí člověk spolyká příliš mnoho, následně ji mnohdy vyzvrátí,
  • spolykání krve vlivem poranění úst či extrakce zubů,
  • vdechnutí nebo spolknutí cizího tělesa, případně otrava,
  • užívání některých léků – jedná se především o nesteroidní protizánětlivé léky.

V některých případech pak dochází ke zvracení krve po alkoholu, což je typické hlavně u pacientů, kteří konzumují alkoholické nápoje na prázdný žaludek, kouří cigarety nebo zároveň užívají antidepresiva či antipsychotika. Za problémy může být zodpovědný také přímo alkoholismus, jenž vede k rozvoji různých onemocnění, jako jsou jícnové varixy či choroby jater. [6, 7, 8, 9, 10, 11]

Doprovodné příznaky

Zvracení krve je stav, kdy pacient vyzvrátí žaludeční obsah smíchaný s určitým množstvím krve nebo dokonce zvrací přímo krev samotnou. Ta může mít klasicky červenou barvu (světle nebo tmavě), ale někdy bývá také hnědá nebo dokonce černá a její vzhled připomíná kávovou sedlinu (lógr). Právě to naznačuje, co by za zvracením krve mohlo stát a jak je daný stav závažný.

Spolu s hematemézou se pak samozřejmě mohou objevit i další příznaky, které není radno podceňovat. Poměrně častá je například kombinace nevolnosti, bolesti břicha a zvracení krve. Kromě toho si lidé v některých případech stěžují také na následující problémy:

Pokud zaznamenáte zvracení krve spojené s popsanými projevy, na nic nečekejte a ihned vyhledejte lékaře nebo kontaktujte zdravotnickou záchrannou službu. To samé pak platí samozřejmě i v případě, kdy se hemateméza dostaví jako důsledek nějakého závažného poranění, a znepokojit by vás rozhodně mělo i zvracení krve u dětí. [12, 13, 14, 15]

Zvracení krve v těhotenství

Těhotenské nevolnosti dnes představují poměrně běžnou záležitost, s níž se v průběhu prvního trimestru (nebo klidně i později) setká velké množství nastávajících maminek. Pokud ovšem gravidní žena zaznamená příměs krve ve zvratcích, měla by zpozornět. Příčina může být sice banální, ale zároveň může být na vině i závažný zdravotní problém.

Za přítomnost krve ve zvratcích může být zodpovědné například krvácení dásní, což je v těhotenství velmi časté. K dalším možným příčinám se pak řadí krvácení z nosu, podráždění ústní dutiny, hrdla nebo třeba jícnu, ale i žaludeční vředy. Hemateméza v těhotenství obvykle není znamením potratu, ale spolu s dalšími symptomy může naznačovat, že s pacientkou něco není v pořádku. Proto je nutné raději ihned kontaktovat lékaře a poradit se s ním o dalším postupu. [16, 17, 18]

Možné komplikace

Pokud dojde k opravdu masivnímu krvácení z trávicího traktu, pacientovi hrozí smrt z důvodu vykrvácení, zatímco při krvácení z traktu dýchacího ohrožuje člověka na životě spíše udušení. K nejzávažnějším komplikacím hematemézy se pak řadí vdechnutí žaludečního obsahu s příměsí krve, což může způsobit nahromadění hmoty v plicích, rozvoj aspirační pneumonie a případně úmrtí.

V závislosti na vyvolávající příčině se pak mohou objevit také další komplikace zvracení krve, což je v první řadě anémie (chudokrevnost). Nadměrné krvácení totiž způsobuje úbytek červených krvinek a dalších krevních elementů, které se nestíhají dostatečně rychle obnovovat. Náhle vzniklé anémie se pojí například s krvácením z jícnových varixů, zatímco postupně se tento stav rozvíjí třeba vlivem žaludečního zánětu nebo některých medikamentů.

Dalším problémem, který se může vlivem hematemézy dostavit, je hypovolemický šok. Je-li zvracení krve skutečně masivní, dochází k rozvoji šokového stavu, jenž se projevuje třeba mělkým dýcháním, závratěmi, oligurií (snížená diuréza) nebo zblednutím pokožky. Pokud nedojde k okamžitému zahájení léčby, pacientovi hrozí kóma a v nejhorším případě také smrt. [19, 20, 21, 22]

Von Willebrandova choroba patří mezi krvácivá onemocnění. Co způsobuje?
Přečtěte si také:

Von Willebrandova choroba patří mezi krvácivá onemocnění. Co způsobuje?

Diagnostika

Pokud jste zaznamenali příměs krve ve zvratcích nebo u vás došlo přímo ke zvracení krve, jistě přemýšlíte, jak si s tímto problémem poradit. Důležité je co nejrychleji vyhledat lékaře, který se bude zajímat o vaše symptomy a provede všechna potřebná vyšetření, jako je například gastroskopie (endoskopická metoda) a v případě vykašlávání krve také bronchoskopie.

Během endoskopického vyšetření jícnu a žaludku lékař zavede ústy dovnitř dutou hadici s kamerou, jejímž prostřednictvím vyšetří sliznice přítomných orgánů. Tímto způsobem se pokusí odhalit zdroj a přesnou lokalizaci krvácení, ale zároveň jej může v některých případech dokonce zastavit. Nepodaří-li se příčinu zjistit, provádějí se pak i další testy (krevní obraz, zobrazovací metody, biopsie). Na základě výsledků lékař následně určí vhodné řešení situace.

Důležitou součástí diagnostiky je v tomto případě také zjišťování, co přesně pacient v předchozím období konzumoval. Pokud se jednalo například o červenou řepu, borůvky nebo víno, zbarvení může být důsledkem právě těchto potravin či nápojů. Také je nutné zhodnotit užívané léky, které mohou mít na svědomí podráždění žaludeční sliznice a krvavé zabarvení zvratků. [23, 24, 25, 26]

Léčba hematemézy

Jedná-li se o stav, který akutně ohrožuje pacienta na životě, je samozřejmě nutné co nejrychleji kontaktovat lékaře nebo zdravotnickou záchrannou službu a zajistit adekvátní ošetření. Jedná se především o zastavení masivního krvácení, ale patří sem i krevní transfuze a doplňování potřebných tekutin, živin nebo případně kyslíku či aplikace vhodných medikamentů.

Pokud jde o to, jaké léky nasadit při zvracení krve, mohou to být například léčiva přímo proti zvracení, pro zastavení krvácení nebo pro snížení kyselosti žaludečních šťáv. V ostatních případech, kdy není člověk zvracením krve přímo ohrožen, se zkoumá hlavně příčina zvracení krve, podle čehož je následně možné zvolit vhodnou terapii.

Pokud má hemateméza nějaký banální důvod, jako je poranění v ústní dutině nebo krvácení z nosu, daný stav by se měl poměrně rychle sám od sebe upravit. Je-li na vině jiné onemocnění, lékaři se soustředí primárně na jeho odstranění nebo alespoň na zlepšení pacientova stavu, a to opět za pomoci různých zákroků, medikamentů a terapií. Kromě toho mohou být nápomocné i změny životního stylu, například zanechání kouření a omezená konzumace alkoholu. [27, 28, 29, 30, 31]

Zdroje: stefajir.cz, lekarske.slovniky.cz, cs.medlicker.com, wikiskripta.eu, webmd.com, healthline.com, my.clevelandclinic.org, nhs.uk, ncbi.nlm.nih.gov, parents.com, muschealth.org

  • Žádné názory
  • 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 »