Testy odhalily nebezpečné chemikálie v dětských bundách. Nejhůře dopadl český výrobek

18. 1. 2024

Sdílet

Snažíte se, aby děti jedly zdravou stravu, berete je do přírody na čerstvý vzduch? Ale možná vás nenapadlo, že zdrojem tělu škodlivých látek může být i to, co nosí na sobě. Studie, kterou zveřejnila organizace Arnika, odhalila, že mnohé dětské bundy běžně dostupné i na zdejším trhu obsahují alarmující množství zakázané látky PFOA.

Nová studie provedená na více než třiceti dětských bundách a kombinézách zakoupených v sedmi evropských zemích – Německu, Česku, Nizozemsku, Polsku, Velké Británii, Srbsku a Černé Hoře – zjistila ve více než polovině nebezpečnou a celosvětově zakázanou perfluoroktanovou kyselinu (PFOA). Přesněji řečeno, obsahovalo je 17 výrobků z 32. 

Je přitom možné, že výrobce použil původně jinou látku, která však postupem času na nebezpečnou PFOA degradovala, což je známý proces. 

PFOA patří mezi takzvané věčné chemikálie PFAS, které se nerozkládají a hromadí se v životním prostředí. Navíc zřejmě přímo škodí zdraví – existuje podezření, že má negativní vliv například na imunitu nebo na rozvoj nemocí srdce a cév. Studie na toto téma ještě probíhají. 

Arnika tyto analýzy financuje z grantů, které získala od Ministerstva životního prostředí, Evropské sítě nevládních organizací European Environmental Bureau a od americké nadace Broad Reach Fund.

Zvláště znepokojivé jsou výsledky, pokud jde o dětské softshellové bundy z České republiky, v nichž testy odhalily nejvyšší množství této toxické látky. Devět bund obsahovalo PFAS v množstvích přesahujících limity EU pro PFOA a/nebo PFCA s dlouhým řetězcem. Jde přitom o látky, které jsou buď celosvětově zakázány, nebo se k jejich zákazu schyluje. 

Výrobky byly zakoupené v běžných obchodech, často v řetězcích s outdoorovou a sportovní módou. Většina z nich byla vyrobena v Číně, případně v Bangladéši. 

Přestože jsme v některých softshellových bundách na českém trhu věčné chemikálie očekávali, přítomnost celosvětově zakázaného PFOA a nešťastné prvenství českých bund v žebříčku nejhorších vzorků ve studii nás zaskočilo. Věčné chemikálie PFAS jsou skutečnou hrozbou pro lidské zdraví a životní prostředí. Čím více se toho o nich dozvídáme, tím větší obavy v nás díky své všudypřítomnosti, odolnosti a schopnosti se hromadit v těle i v prostředí vzbuzují, uvádí odbornice na PFAS a autorka studie Jitka Straková. Ta je mimo jiné členkou International Pollutants Elimination Network (IPEN), sdružující více než šest set nevládních organizací zaměřujících se na boj se znečišťováním životního prostředí. 

Chemická černá díra

Nejvíce znečištěné věčnými chemikáliemi PFAS byly v rámci studie dětské softshellové bundy zakoupené v Česku počátkem roku 2022 – konkrétně šlo o výrobky firem Hannah a Husky. Vyšší obsah věčných chemikálií PFOA nebo FTOH v těchto bundách (byly zakoupeny o rok dříve než bundy z jiných zemí), lze vysvětlit průběžnou degradací fluorovaných polymerů s postranním řetězcem (SFP). Špatně dopadl také výrobek značky NordBlanc, v němž bylo celkové množství rizikových chemikálií nejvyšší. A například v bundě značky AlpinePro bylo hodně flurových sloučenin, které však laboratoře nedokážou dost dobře změřit – pokud však jde o PFAS, dopadl tento výrobek nejlépe. 

Alespoň jeden z 58 zástupců sledovaných chemikálií byl zjištěn v devíti z deseti testovaných dětských bund zakoupených v Česku. 

Studie proto zdůrazňuje, že složení a koncentrace jednotlivých PFAS v textilu se kvůli degradaci průběžně mění. Spotřebitelé a někdy i výrobci outdoorového oblečení proto nikdy nevědí, jakým PFAS a v jaké koncentraci jsou vystaveni. To je jeden z důvodů, proč by měly být věčné chemikálie, včetně fluorovaných polymerů s postranním řetězcem (SFP), zakázány jako celá skupina, uvádí studie publikovaná Arnikou. Celý text (v anglickém jazyce) najdete zde – plné znění zahrnuje více výrobků, zakoupených i mimo evropské trhy. 

Bundy, které dopadly špatně v testech, už nenabízíme, říká výrobce Přečtěte si také:

Bundy, které dopadly špatně v testech, už nenabízíme, říká výrobce

Nebyl to přitom první podobný test, který by pro výrobky dopadl tak bídně. Arnika testovala v roce 2020 dětské rukavice. Výsledky dopadly velice obdobně – ve vzorcích se našla PFOA a další zástupci PFAS. Výrobci obecně hřeší na používání složitých polymerních PFAS, které nejsou zakázané, ale je zřejmé, že se na zakázané PFAS typu PFOA rozkládají, uvedla Karolína Brabcová z organizace Arnika. Podle ní je proto namístě zakázat PFAS jako celek.

V aktuálním testu nesplnilo platné limity 8 z 10 bund z důvodu nadměrné koncentrace 2 podskupin sloučenin (PFOA a PFCA) = nad 25 pp nebo ng/g. To ale nemusela být pravda v době nákupu, protože bundy se ošetřují fluorovanými polymery s krátkým řetězcem, které se časem pravděpodobně rozkládají právě na nižší sloučeniny včetně té nejznámější a již zakázané PFOA neboli kyseliny perfluoroktanové.

Negativní dopady na zdraví

Zřejmě navíc existuje souvislost mezi opakovaným vystavováním dětí věčným chemikáliím PFAS a zdravotními problémy, jako je zvýšená hladina cholesterolu v krvi, dyslipidemie (nerovnováha lipidů související s kardiovaskulárními chorobami), mírně snížená porodní hmotnost a snížená reakce na některé vakcíny/infekce. 

Děti jsou vůči PFAS zranitelnější kvůli nižší tělesné hmotnosti, rozdílům v příjmu vody a potravy, vyvíjejícím se orgánovým systémům a dalším faktorům. V poslední době se také objevila studie z Finska publikovaná v renomovaném časopise Journal of the National Cancer Institute, která ukazuje na možný vztah zvýšeného výskytu věčných chemikálií a onemocněním dětskou leukemií.

Perfluorované a polyfluorované látky jsou lidskému oku neviditelné, prakticky věčné a zdraví škodlivé. Jsou v předmětech každodenní potřeby. V obalech potravin se užívají na ochranu před prosakováním tuku, aby se například na sáčku s hranolky nevytvářely mastné skvrny a vy si neumazali prsty. V porovnání s možným rizikem proniknutí do těla spotřebitele mají velmi malý přínos. V průběhu času se hromadí ve vodě a v půdě, dostávají se do trávicího traktu a do masa hospodářských zvířat i do lidského organismu. Také se jim říká ‚nesmrtelné chemikálie‘, a protože řada z nich patří mezi škodlivé látky, které mohou vést ke zdravotním problémům, například poškození jater, onemocnění štítné žlázy, neplodnosti a rakovině, je nezbytné jejich výskyt řešit, citoval Technický týdeník profesora Tomáše Cajthamla z Akademie věd s tím, že zákaz těchto látek podporuje.

Colové limonády se na zahnání žízně moc nehodí. Test ukázal, co v nich je Přečtěte si také:

Colové limonády se na zahnání žízně moc nehodí. Test ukázal, co v nich je

Každopádně, už se ví, že se PFAS v prostředí vůbec nerozkládají a znečišťují všechny vodní ekosystémy včetně pitné vody až stovky let poté, co se do životního prostředí lidskou činnosti dostanou. Vyprchají tyto chemické látky časem? A jaký vliv má na to praní – sníží obsah látek v oblečení, ale o to více se jich uvolní do odpadních vod? 

Ano, časem, a to zejména praním, se tyto látky z oblečení uvolňují do odpadních vod. Čistírenské kaly jsou pak jedním z významných zdrojů znečištění životního prostředí těmito látkami, popsala Brabcová z Arniky. Potvrdil to i výzkum Tomáše Cajthamla z Akademie věd – poukázal v něm mimo jiné na to, že pokud se kaly z čistíren hnojí zelenina, dostávají se nebezpečné látky do lidského potravinového řetězce. 

Jen velmi málo bund a dalších syntetických textilií se recykluje, což znamená, že oděvy ošetřené PFAS budou pravděpodobně skládkovány nebo spalovány, čímž se tyto chemické látky uvolňují do životního prostředí, kde přetrvávají. Ani recyklace bund s obsahem věčných chemikálií a jejich přenášení do recyklovaných textilií však není žádoucí. PFAS ohrožují zdraví a životní prostředí od své výroby až do momentu, kdy se stane výrobek odpadem, uvádí proto ve své studii Arnika.

Perfluorované a polyfluorované alkylové sloučeniny (PFAS) 

Běžně se používají v řadě odvětví. Známé je použití v teflonu nebo Gore-Texu, ale jsou i v papírových obalech na potraviny, v outdoorovém oblečení nebo v kobercích. Mezi PFAS patří zhruba 12 tisíc chemických látek, pro které je charakteristická vazba fluoru a uhlíku – to vede k tomu, že se samy nerozkládají a nepřetržitě se v životním prostředí kumulují. K jejich likvidaci je potřeba teplota kolem tisíce stupňů Celsia – tak je lze teoreticky zničit ve spalovnách, ale je otázkou, jak je odstranit z vody nebo horninového prostředí. 

Zdroj: technickytydenik.cz

Zákazník nicméně nemá šanci poznat, jaké látky tam jsou. Často to bohužel nevědí ani výrobci bund. Zákazníci se mohou jedině řídit označením některých výrobců, kteří si na tom staví marketing a ve valné většině pravdivě informují, že oblečení je PFAS-free.

Odborná práce zároveň zdůrazňuje, že skutečně existují dostupné alternativy k používání věčných chemikálií PFAS při impregnaci bund. V rámci samotného výzkumu jich bylo bez jejich obsahu zakoupeno na evropském trhu patnáct. Fakt, že lze vyrábět i bez PFAS dokazuje podle Brabcové z Arniky i to, že řada společností a prodejců outdoorového oblečení se k tomu zavázala zcela dobrovolně, na základě poptávky spotřebitelů. 

Z vývoje trhů v jednotlivých zemích jde proto říct, že společnosti prodávající na západoevropských a skandinávských trzích s informovanějšími a uvědomělejšími spotřebiteli nabízejí více produktů bez PFAS než země s malým tlakem veřejnosti, říká k tomu Karolína Brabcová z Arniky. Jinými slovy, byli to zákazníci, kdo si vyžádali, aby se na trhu objevovalo čím dál více PFAS-free výrobků. 

Zde odkaz na excelovou tabulku s podrobnými výsledky: 

Výsledky laboratorních test dětských bund zakoupených v České republice

Shrnutí

  • Vysoce toxická a celosvětově zakázaná chemická látka PFAS byla nejčastější věčnou chemikálií ve výrobcích. 
  • Byla nalezena v 17 outdoorových bundách. Také další věčná chemikálie, PFDA, byla nalezena v 17 vzorcích. 
  • Její používání je podle pravidel EU omezeno a byl doporučen její celosvětový zákaz. Z 15 dalších látek PFAS, identifikovaných v analyzovaných oděvech, byla v nejvyšších koncentracích naměřena látka FTOH. 
  • Přítomnost FTOH naznačuje, že ve výrobcích byly použity polymerní PFAS (fluorované polymery s postranním řetězcem; SFP). Ty se následně rozkládají na další PFAS, včetně celosvětově zakázaného PFOA a dalších věčných chemikálií, které jsou v současné době pod legislativním dohledem.

Autor článku

Jako redaktorka se specializací na zdravotnictví prošla deníky Lidové noviny a Mladá fronta DNES. Už několik let se věnuje on-line žurnalistice jako autorka i editorka, psala například o mýtech a dezinformacích pro Seznam Zprávy. 

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