Bolest na hrudi může znamenat cokoliv. Za jakých okolností je potřeba volat lékaře?

9. 12. 2022 9:00
44 nových názorů
ručitel
MUDr. Daniel Petr | Odborný garant článku

S bolestí na hrudi se lze setkat relativně snadno. Jedná se totiž o příznak, jenž je důsledkem celé řady nemocí. Tyto nemoci přitom mohou být povahově velice odlišné. Některé se dají označit za banalitu, jiné dokáží člověka bezprostředně ohrozit na životě. 

Co znamená bolest na hrudi?

Ať už vás trápí dlouhodobá bolest na hrudi, která se projevuje jako tlak za hrudní kostí či píchání na hrudi u srdce, nebo je to „pouze“ občasná bolest na hrudi, která rychle vymizí, jistě přemýšlíte, co za těmito zdravotními obtížemi stojí. Příčin, které mohou vyvolat bolest na hrudi (občas pacienty popisovanou jako bolest na plicích) však existuje celá řada.

Pokud jde o to, jaké konkrétní obtíže způsobuje bolest na hrudi a jak se tento nepříjemný příznak většinou projevuje, pacienti popisují své problémy různě. Nejčastěji si stěžují na některé z následujících zdravotních komplikací:

  • tlak na hrudi,
  • pálení na hrudi,
  • píchání na hrudi,
  • svírání na hrudi,
  • tíha na hrudi,
  • bolest na prsou,
  • bolest při nádechu,
  • bolest za hrudní kostí,
  • bolest na hrudi uprostřed,
  • bolest na pravé straně hrudníku,
  • bolest na hrudi při hlubokém nádechu.

Výčet onemocnění, při nichž může pacient pociťovat bolest na hrudi, je vskutku rozsáhlý, a pokud by měl být uveden v celé své délce, vydal by na několik samostatných článků. I proto bude na těchto řádcích věnována pozornost pouze těm, které se ve spojitosti s výše zmíněným symptomem, vyskytují jednoznačně nejčastěji. [1, 2, 3, 4, 5]

Infarkt myokardu

První věc, jež člověka v souvislosti s bolestí na hrudi napadne, je bezpochyby srdeční infarkt, respektive infarkt myokardu. Je to vcelku pochopitelné. Jedná se o onemocnění, které nám v důsledku své povahy nahání pořádný strach. Pokud by totiž na něj došlo, jde pacientovi doslova o život, přičemž o tom, zda se jej podaří zachránit, či nikoliv, rozhodují kolikrát bez nadsázky vteřiny.

Infarkt myokardu nastane tehdy, dojde-li k náhlému ucpání srdeční věnčité tepny, a to v důsledku krevní sraženiny. To má za následek poškození srdečních buněk a odumření částí srdeční svaloviny, které se tak najednou nedostává tolik potřebného kyslíku. Nepodaří-li se ucpanou tepnu včas zprůchodnit, hrozí kompletní selhání orgánu s následnou smrtí postiženého.

Intenzita bolesti na hrudi se může v případě infarktu dosti lišit. Někdy může být extrémně vysoká, jindy ji pacient pro změnu téměř nezaznamená. Vyskytuje se za hrudní kostí, ale zároveň může vystřelovat i do ostatních částí těla včetně břicha, zad, dolní čelisti či levé horní končetiny

Nejčastěji pacienti popisují, že mají pocit, jako by jim někdo hrudník svíral do svěráku. Pakliže má dotyčný důvodné podezření na to, že právě prodělává infarkt, rozhodně by neměl (on nebo někdo v jeho okolí) jakkoliv otálet a měl by naopak co nejdříve přivolat záchranku. [6, 7, 8, 9]

Prodělal někdo z vašich blízkých infarkt myokardu?

Akutní pankreatitida

Tuto podivně znějící diagnostiku lze do češtiny přeložit jako zánět slinivky břišní. Bolest bývá poměrně intenzivní, zpočátku se vyskytuje především v břiše, ale poté se může objevit i bolest hrudníku. V některých případech může pacient dokonce tento příznak pociťovat rovněž v oblasti zad.

Průběh akutní pankreatitidy může být značně variabilní a odvíjí se vždy od vyvolávající příčiny. Vedle samotné bolesti obvykle bývá zánět slinivky břišní doprovázen též pocitem nevolnosti, zvracením, které nepřináší úlevu, tuhnutím břicha či zrychleným srdečním tepem.  V závažnějších případech pak může dojít k multiorgánovému selhání. [10, 11, 12, 13]

Angina pectoris

Podobně jako u infarktu, také v případě anginy pectoris dochází k omezení dodávky kyslíku do srdečního svalu. Koronární tepny se zúží a průtok krve je zredukován, na což srdce začne reagovat bolestí na hrudi, případně pocitem pálení.

Příznaky anginy pectoris a infarktu myokardu jsou velice podobné. Liší se tím, že bolest při angině pectoris odeznívá při klidu a zmírňuje se užitím nitrátů. Pokud poprvé zažíváte svíravou bolest hrudníku, která vystřeluje do levé poloviny těla, na nic nečekejte a vyhledejte ihned lékařskou pomoc. V každém případě potřebujete vyšetření a odbornou péči.

Jelikož nebývá tato bolest tak výrazná, rozpoznat anginu pectoris je pro běžného člověka poměrně těžké. Vzniká zejména při námaze a poměrně brzy (v řádu několika minut) odezní. A proto dotyčného donutí v mnoha případech nanejvýš k tomu, aby si dal krátkou pauzu „na vydechnutí“ a následně se vrátil ke své původní činnosti.

Ačkoliv se v inkriminovaném okamžiku rozhodně nejedná o žádnou život ohrožující situaci, důsledná léčba je více než žádoucí. Pokud by ji totiž pacient dlouhodobě přecházel, může se postižená céva nadále zužovat a přispět tak ke vzniku infarktu. [14, 15, 16, 17, 18]

S rakovinou slinivky si lékaři stále neví rady. Jaké jsou její příznaky?
Přečtěte si také:

S rakovinou slinivky si lékaři stále neví rady. Jaké jsou její příznaky?

Od zápalu plic po stres

Samozřejmě jsou i další, méně závažná onemocnění, která doprovází intenzivní či mírná bolest na hrudi. A ačkoliv se nejedná o nic, co by dotyčného bezprostředně ohrožovalo na životě, může být bolest kolikrát o poznání horší. O jaké konkrétní případy se jedná?

Pakliže pacient pociťuje bolest na hrudi při nádechu, může takovýto příznak souviset například se zánětem průdušek, případně zápalem plic. Velmi nepříjemnou pak může být bolest na hrudi při kašli, přičemž je jedno, zda se jedná o kašel suchý či vlhký. Stejný symptom jako všechny výše zmíněné nemoci ale doprovází například i zánět nebo infekci v oblasti žeber, zablokovanou páteř či různá svalová poranění.

Aby toho nebylo málo, dostavit se může také bolest na hrudi od zad, jelikož do hrudníku běžně vystřeluje bolest, která pochází od páteře. Bývá bodavá, ostrá a nepříjemná, často se zhoršuje při nádechu, ale pacienta by neměla výrazně ohrozit.

Další možné příčiny bolesti na hrudi:

  • perikarditida (zánět osrdečníku),
  • refluxní choroba jícnu,
  • plicní embolie,
  • zánět dýchacích cest,
  • disekce aorty,
  • pneumotorax,
  • zlomenina žeber,
  • panická ataka,
  • myokarditida,
  • anémie,
  • úzkostná porucha,
  • přílišný stres,
  • přenesení bolesti z břicha. [19, 20, 21, 22, 23, 24]
Kvíz: Co víte o infarktu myokardu?
Přečtěte si také:

Kvíz: Co víte o infarktu myokardu?

Jak se bolesti na hrudi zbavit?

Ve snaze zbavit se bolesti na hrudi je zapotřebí zaměřit se na samotnou příčinu, tedy nemoc, která tento pocit vyvolala. Platí, že bolest jako taková je vždy pouze důsledkem, nikoliv počátečním problémem. Někdy může odeznít sama od sebe (například v případě již zmíněné anginy pectoris), jindy zase postačí změnit některé zdánlivě nesouvisející faktory, jakými je třeba nezdravý životní styl či pracovní prostředí. To platí zejména tehdy, pramení-li bolest na hrudi ze stresu.

Pokud je bolest výrazná a nepolevuje, měl by pacient v každém případě vyhledat odbornou pomoct a poradit se o svých problémech s lékařem. Ten provede diagnózu, stanoví pravděpodobnou příčinu a rozhodne o tom, jak se zbavit bolesti na hrudi prostřednictvím vhodné léčby. Ačkoliv příčina obtíží nemusí být závažná, rozhodně ji není radno podceňovat. [25, 26, 27, 28]

Kdy vyhledat lékaře?

Jestliže se tupá bolest na hrudi dostaví prudce, nečekaně a její intenzita nepolevuje, neměli byste návštěvu lékaře odkládat. To samé pak platí také v případě, že je bolest v hrudníku dlouhodobá a přetrvávající, přičemž ohroženi bývají hlavně pacienti, kteří současně trpí onemocněním srdce nebo plic. Záchranku je nutné přivolat ve chvíli, kdy se objeví také některé z následujících komplikací:

  • svíravá nepolevující bolest,
  • pocit těžkého hrudníku,
  • pocit „přeskakování“ srdce,
  • alterace vědomí nebo jeho ztráta,
  • nadměrné pocení,
  • dušnost,
  • nevolnost a zvracení,
  • bolest vystřelující do čelisti,
  • bolest vystřelující do končetin a třísel,
  • bolest vystřelující do břicha. [29, 30, 31, 32, 33]

Zdroje: stefajir.cz, cs.medlicker.com, mayoclinic.org, webmd.com, my.clevelandclinic.org, medicalnewstoday.com, healthline.com, ikem.cz, wikiskripta.eu, nzip.cz

Jak se projevuje bolest na hrudi? 
Zatímco někteří pacienti pociťují občasnou bolest na hrudi, která sama v průběhu času vymizí, jiné trápí dlouhodobá bolest na hrudi, která se projevuje například jako trvalý tlak za hrudní kostí. Každý pacient přitom popisuje své problémy jiným způsobem, přičemž nejčastěji lékaři řeší pálení na hrudi, píchání na hrudi, tíhu na hrudi, bolest na prsou, bolest při nádechu, bolest za hrudní kostí nebo třeba bolest na pravé straně hrudníku. 
Jaké má bolest na hrudi příčiny? 
Bolest a tlak na hrudi mohou pacienti pociťovat z mnoha různých důvodů. Zatímco některé příčiny se dají poměrně dobře léčit, jiné mohou být velice nebezpečné. Na vině může být například obávaný infarkt myokardu, angina pectoris, akutní pankreatitida, zápal plic, zablokovaná páteř, svalová poranění, zánět osrdečníku, refluxní choroba jícnu, plicní embolie, zánět dýchacích cest, zlomenina žeber, úzkostná porucha, stres či disekce aorty. 
Podle čeho poznáte infarkt myokardu? 
Nejčastější příčinou, která člověka ve spojitosti s bolestí na hrudi obvykle napadne, je infarkt myokardu. K tomuto zdravotnímu problému dojde ve chvíli, kdy se náhle ucpou srdeční věnčité tepny v důsledku přítomnosti krevní sraženiny, což vede k poškození srdečních buněk a odumření části srdce. Mezi hlavní příznaky patří bolest za hrudní kostí, která může vystřelovat do břicha, zad, čelisti nebo do levé končetiny, ale také nadměrné pocení, únava či dušnost. 
Jak se zbavit bolesti na hrudi? 
Pokud vás trápí bolest na hrudi, je nejprve nutné zaměřit se na vyvolávající příčinu obtíží. Pokud tento problém neustává a znepříjemňuje vám život, vyhledejte lékaře, který provede diagnostiku a podle výsledků navrhne vhodnou léčbu, která by měla zdravotní komplikace vyřešit. Jestliže je bolest velice intenzivní, dostaví se prudce nebo vůbec nepolevuje, měli byste okamžitě kontaktovat záchrannou službu. To samé platí v případě, že píchání na hrudi doprovází také pocit těžkého hrudníku, dušnost, nadměrné pocení, nevolnost či vystřelování bolesti do jiných částí těla.
Suzanna (neregistrovaný)

Dobrý den mám bolesti Na pravé straně na hrudi je to bolest při nádechu a pohybu včera sem byla u lékaře ten mi dál kyslík a infekcí do zadku ale nic ztoho nepomohlo stále mám bolesti prosím co mám dělat děkuji

Dobrý den,
pokud bolest nepřestává, navštivte svého praktického lékaře určitě znovu. Měl by vás dovyšetřit - krevní odběry, RTG hrudníku, EKG atd.

K.L. (neregistrovaný)
Dobrý den, již cca 14 dní -mě trápí bolest na hrudníku. uprostřed v horní části (prsní)....nejhorší je to hlavně při usínání. Jakoby to pálí. Nemůžu kvůli tomu usnout. Bolí mě to i přes den naomak ..... Intenzivnější je to na levé části. Je fakt, že poslední dobou se více stresuji.. Je v tomto případě vhodné vyhledat lékaře?
MUDr. Thai Bao Han (neregistrovaný)
Dobrý den, určitě navštivte lékaře k provedení skiagramu hrudníku a kardiologického vyšetření, odběry,..
Michal (neregistrovaný)

Dobrý den, víte prosím, co to tehdy způsobovalo? Pociťuji poslední dobou celkem podobné příznaky a taky jsem se teď víc stresoval (kvůli škole).

  • 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 »