Nejhorší potraviny roku 2016

5. 1. 2017

Sdílet

Které potraviny skončily loni Na pranýři? Kdo je prodával a jaké byly nejčastější prohřešky?

Státní zemědělská a potravinářská inspekce (SZPI) se zaměřuje tam, kde předpokládá potíže s kvalitou. „Při kontrole upřednostňujeme ty provozovatele a jejich výrobky, kde lze z nejrůznějšího důvodu očekávat problémy,“ říká Jindřich Pokora, ředitel odboru kontroly.

Opakovaně se proto v žebříčku nejhorších potravin objevuje kategorie masných výrobků a vína, nováčkem jsou mléčné výrobky, na které se v loňském roce SZPI speciálně zaměřila kvůli dopadům ukončení režimu mléčných kvót.

SZPI nejakostní, falšované a nebezpečné potraviny zveřejňuje na serveru Potraviny na pranýři.

Na pranýři se ocitají potraviny:

  • Nejakostní
    Nedodržují složení určené právními předpisy nebo uvedené v označení potraviny.
  • Falšované
    Uvádějí zákazníka při nákupu v omyl. Například záměrně zamlčují důležité informace o složení potraviny nebo o jejím původu.
  • Nebezpečné
    Obsahují nepovolené látky nebo překračují limity povolených látek. Obsahují neuvedené alergeny. Jeví známky kažení, plíseň, škůdce. Obsahují cizorodé předměty apod.

Nejhorší potraviny roku 2016

Loni SZPI na svém serveru Potraviny na pranýři zveřejnila celkem 246 nejakostních, 263 falšovaných a 331 nebezpečných potravin.

Podle Jindřicha Pokory je chyba většinou na straně maloobchodu: „Porovnávat četnost chyb obchodu a výrobců v podmínkách České republiky je po řadu let poměrně jednoduché. Podle mého kvalifikovaného odhadu je četnost chyb na straně retailu několikanásobně vyšší, než je tomu u výrobců,“ říká.

Jak dopadly jednotlivé skupiny potravin?

Brambory (20)

V případě brambor šlo vždy o falšování, kdy byla uvedena nesprávná odrůda a spotřebitel tak byl uváděn v omyl. Celkem se jednalo o dvacet zjištěných případů.

Cukrářské výrobky a těsta (10)

SZPI loni zjistila deset případů nevyhovujících cukrářských výrobků. S výjimkou falšovaného punčového řezu, který obsahoval nepovolené barvivo, se u ostatních zákusků jednalo o nebezpečné potraviny. Byla zjištěna přítomnost plísně a bakterií, které způsobují listeriózu či salmonelózu.

Čerstvá zelenina (8)

Čerstvá zelenina a byliny mají nejčastěji potíže s překročením maximálního limitu reziduí pesticidů.

Čerstvé ovoce (2)

Čerstvé ovoce mělo loni problémy jen dvakrát, a to s limity pesticidů.

Čokoláda, cukrovinky (16)

Čokoládové výrobky měly deformovaný tvar a obsah, byly skladovány při nevyhovujících teplotách. Cukrovinky obsahovaly neuvedené alergeny či barviva.

Dehydratované výrobky, tekutá ochucovadla, dresinky, sůl, hořčice (7)

Pestrá skupina výrobků s pestrou paletou prohřešků – od ztužovače šlehačky označeného českou vlajkou a nápisem Česká kvalita původem ze Slovenska přes neuvedené alergeny a zkažené potraviny až po sušenou smetanu, která nebyla smetana.

Jedlé tuky, oleje (9)

Hned několik olivových olejů neslo označení „extra panenský“, ale dle laboratorního rozboru šlo pouze o kategorii nižší („panenský olivový olej“). V jednom případě dokonce o kategorii oleje nevhodnou k maloobchodnímu prodeji.

Kakao, směsi kakaa s cukrem (5)

Výrobky obsahovaly přídatnou látku (regulátor kyselosti), která nebyla uvedena ve složení na obale.

Káva, kávoviny, čaj (2)

Pouhé dva nálezy v této skupině potravin se provinily překročením limitu reziduí pesticidů a přítomností nepovoleného náhradního sladidla. V obou případech šlo o čaje.

Koření (5)

Různé kořenící směsi jednoho výrobce obsahovaly neuvedený alergen (celer).

Lihovarnické výrobky (11)

Lihoviny měly nejčastěji problémy s etanolem. Některé ho obsahovaly méně, než bylo uvedeno na obale, jiné uváděly mylně jeho původ.

Luštěniny, olejnatá semena (11)

Většina problémů se týkala máku. Opakovaně byly překročeny maximální limity reziduí pesticidů, případně potravina vykazovala známky žluknutí. Luštěniny se zase potýkaly s nezvanými hosty – byla zjištěna přítomnost živých i mrtvých škůdců.

Masné výrobky (190)

Absolutně nejpočetnější skupina Na pranýři. 50 výrobků ohodnotila inspekce coby nejakostní, falšovaných bylo 39 a celých 101 masných výrobků spadlo do kategorie nebezpečných potravin. Plísně, oslizlý a lepkavý povrch, zápach po kažení, to vše je k mání v našich obchodech. Mezi falšované se masné výrobky dostaly nejčastěji kvůli šizení na mase. Nejakostní masné výrobky nedodržely předepsané složení nebo složení uvedené na obale, například obsahovaly více vody, tuku či soli.

Med (38)

Inspekce hodnotí jako vážnou loňskou kauzu medu výrobce Včelpo. Medy byly ve značném množství deklarovány jako české, přestože z ČR nepocházely, a obsahovaly rezidua antibiotik.

Mléčné výrobky (153)

Zjištění nevyhovujících mléčných výrobků, a to dle inspekce především zahraničních, byla loni relativně častá. Šlo o 58 nejakostních výrobků, které uváděly např. nepravdivé informace na obale, a o 57 falšovaných produktů (typickým příkladem je prodejce Penny Market, který opakovaně označoval potraviny na regálové etiketě nápisem „Česká kvalita“ a grafickým vyobrazením vlajky ČR, přitom země původu výrobku nebyla Česká republika). Nebezpečné mléčné výrobky zjistila SZPI v 38 případech, kdy narazila na viditelně plesnivé potraviny.

Mlýnské obilné výrobky a obilniny (28/3)

Častým problémem jsou škůdci, kterým se při špatném skladování v obilných výrobcích výborně daří. Jako nebezpečné hodnotila inspekce také výrobky, které obsahovaly ve značném množství tropanové alkaloidy (atropin a skopalamin). Taková potravina může vyvolat akutní zdravotní potíže zejména u citlivých jedinců.

Nealkoholické nápoje (17)

Převážně šlo o falšované nápoje s neodpovídajícím složením a nepravdivými informacemi, například mnohonásobně nižším obsahem vitamínu C.

Pekařské výrobky (47)

Žluklá chuť a vůně, zatuchlost, plíseň, ale i škůdci, taková byla zjištění SZPI u převážně trvanlivých pekařských výrobků.

Pivo (5)

Pivo mělo problém jen výjimečně. Extrakt původní mladiny, který určuje sílu piva, byl nižší, než je stanoveno příslušnou vyhláškou.

Pokrmy (11)

Ve skupině připravených pokrmů šlo o nejrůznější prohřešky od mylných informací, obsahu alergenů až po nižší podíl masa.

Ryby, vodní živočichové (25)

Stále stejný problém – místo ryb si kupujeme vodu, případně různé látky, jen ne maso. Některé výrobky ho obsahovaly i o polovinu méně, než tvrdily na obalu. Inspekce narazila i na případy nebezpečných potravin, kdy rybí maso obsahovalo parazity nebo vykazovalo známky kažení.

Skořápkové plody (22)

Ořechy, mandle i jedlé kaštany trápí škůdci a plísně, někdy také zapomenuté skořápky.

Studená kuchyně (6)

Z šesti nálezů bylo pět produktů studené kuchyně nebezpečných, šlo například o knedlíky plesnivé vinou špatného skladování nebo potravinu kontaminovanou bakterií, která způsobuje listeriózu.

Těstoviny (1)

Jediný zástupce skupiny těstovin: bylinkové nudle obsahovaly alergen (celer), který nebyl uveden na obale.

Víno (134)

Víno již tradičně patří k nejpočetněji zastoupené skupině Na pranýři. Vzhledem k dlouhodobým potížím se inspekce zaměřuje na kontrolu jeho kvality. V minulém roce zjistila 92 případů nejakostního vína, kdy v chuti a vůni vína byla často patrná oxidáza, tzv. hnědnutí vína (vada, kdy víno má až nahnědlou barvu a chuť a vůni po jablkách), nebo stopy po myšině nebo po plísni. 34 vín bylo falšovaných za použití nepovolených látek, cukru nebo vody. 8 vín pak inspekce hodnotila jako nebezpečnou potravinu.

Zmrzliny, mražené krémy (6)

Několik málo nálezů spadlo do kategorie nejakostních potravin kvůli deformovanému tvaru – zřejmě v důsledku špatného skladování.

Zpracovaná zelenina a houby (4)

4 případy nebezpečných produktů se týkaly kysaného zelí, oliv, červených fazolí a zeleninových hranolků.

Zpracované ovoce (25)

Do této skupiny spadá jak sušené či zmrazené ovoce, tak například ovocné pomazánky a džemy a další výrobky ze zpracovaného ovoce. Stejně pestré jsou zjištěné vady a prohřešky. Šlo například o šizení na obsahu, uvádění nesprávných informací, známky kažení i použití nepovolených látek.

Zvláštní výživa, doplňky stravy (15)

Některé výrobky obsahovaly v podstatně menším množství některou ze svých složek, mnohdy pro daný výrobek zásadní, například vitamín či kolagen. Jiné byly naopak nebezpečné pro překročení limitů látek, například olova či THC.

Autor článku

Redaktorka, editorka, dlouholetá šéfredaktorka serveru Vitalia.cz (do června 2022)

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