Džem Jahůdka nebo Borůvka nebo... - stejně jsou to hlavně jablka

30. 1. 2012

Sdílet

Autor: Isifa.cz
Možná vám záleží hlavně na sladké chuti a podíl ovoce moc neřešíte. Cukru je v džemech a marmeládách vážně víc než dost, což se o ovoci vždy říct nedá. Kolik ho má být a jaká je realita?

V marmeládě či džemu, které jsou u nás běžně k dostání, může být sedmdesát, ale taky klidně jen dvacet procent ovoce. Případně je tam sice ovoce, které září na etiketě, ale je doplněné dalším druhem, o který už zase tak moc nestojíte. Nepočítejte s tím, že vás na to výrobci budou příliš upozorňovat. Nechcete-li naletět, musíte pozorně číst ještě v obchodě.

Klame se na etiketách, šidí se na obsahu

Dali byste si výrobek nazvaný Džem jahůdka, k jehož koupi vás láká obrázek tohoto ovoce na přebalu? Možná budete mít pocit, že nechutná tak úplně jako jahody, jako by v něm bylo ještě něco navíc.


Autor: SZPI

Džemy z Polska, které obsahovaly výrazně méně ovoce, než bylo deklarováno na obalu, nedávno stahovala inspekce z trhu

Není divu, stačí skleničku otočit – na druhé straně etikety se dočtete, že obsahuje tyto suroviny a to v následujícím pořadí: cukr, jablka, jahody a různé konzervační a přídatné látky. Co na tom, že výrobce zároveň píše, že „šťavnaté čerstvé jahody obsahují přírodní vitamín C a jejich sladká chuť se snoubí s jablečným základem výborného džemu.“ Je jasné, že v tomhle džemu je více jablek než jahod, a navíc ani celkový podíl ovoce není nic moc. Jablek je tam totiž dvacet procent a jahod patnáct, takže džem tak tak splňuje normu pro to, aby vůbec mohl být nazýván džemem. Stejný poměr ovoce obsahuje i další podobný produkt Hamé, džem nazvaný Borůvka.

A rozhodně to nejsou jediné sporné výrobky, na které můžete narazit. Podobných směsí i od jiných výrobců je na pultech plno.

Potvrzují to opakovaně i šetření Státní zemědělské a potravinářské inspekce, podle nichž výrobci buď přidávají nepovolené příměsi z jiných druhů ovoce, nebo produkty nesplňují údaje uvedené na obalech. „Obě praktiky vedou k tomu, že se na trhu objevují potraviny, které se vydávají za něco, čím ve skutečnosti nejsou, a spotřebitel nemá příliš mnoho šancí je rozpoznat,“ uvedla inspekce ve svém tiskovém prohlášení. Pokud jde o cizí příměsi, neuspěly především džemy dovážené z Polska a Chorvatska.

Podívali jsme se proto na složení výrobků a na to, kolik ovoce džemy a marmelády skutečně obsahují.

Džem versus marmeláda

Mimochodem, víte, jaký je rozdíl mezi džemem a marmeládou? Není v tom, že v jednom je ovoce více a v druhém méně rozemleté, jak si mnoho lidí myslí. Takovéto rozdělení platilo do roku 2004, kdy Česká republika přijala dělení platné původně ve Velké Británii a následně pak i v celé Evropské unii. Do té doby se tu i podle českých norem považovaly za marmeládu výrobky jednolité tužší konzistence bez viditelných kousků ovoce, zatímco džemy byly řidší, lépe se natíraly a přitom v nich právě ovoce bylo vidět.

Nově se jménem marmeláda smí označovat pouze výrobky z citrusových plodů, marmeláda tak může být třeba citronová nebo pomerančová. Z jahod, rybízu či višní a borůvek však můžete vyrobit pouze džem. Liší se také požadovaný obsah ovoce – zatímco v citrusových marmeládách ho musí být nejméně dvacet ze sta gramů, v ovocných džemech by výrobce neměl klesnout pod pětatřicet. Pokud chcete v džemech větší obsah ovoce, musíte si připlatit a koupit dražší, které se označují jako „extra“. V těch musí být alespoň 45 gramů ovoce na sto gramů hotového výrobku.

U marmelád je přitom hranice stanovená na 20 g ovoce ve 100 gramech výrobku, a tak třeba pomerančová marmeláda Schwartau je svým složením skutečně marmeládou, obsahuje z ovoce jen pomeranče, ale je jich tam jen 40 gramů na sto gramů výrobku. V extra malinovém džemu stejného výrobce je malin 50 procent.

Co musí být na obalu

  • skutečné použité množství ovocné složky
  • podíl cukru ve výrobku
  • označení „marmeláda“ se používá výhradně, jsou-li surovinou citrusové plody
  • označení „výběrové“ nebo „extra“ pouze pro džemy, které obsahují vyšší podíl ovocné složky (viz dále)

Extra, výběrový nebo obyčejný?

Pozor také, nenechte se zlákat ani označením „výběrový“– například výrobce Hamé nabízí výběrové marmelády, ale je v nich v podstatě stejně ovoce jako v těch, které se nabízejí pod označením extra. V případě Hamé jde spíše o způsob balení, výrobky s označením extra jsou takřka dvojnásobně velké.


Autor: Isifa.cz

Džem výběrový nebo extra musí mít větší podíl ovocné složky

Navíc, někde se pod nenápadným označením skrývá hodně kvalitní výrobek – řeč je třeba o tom, který se jmenuje Jahodová zavařenina, a mají ho v síti DM drogerií. Obsahuje z 55 procent jahody, dále je v něm třtinový cukr, jablečný pektin a koncentrát citrónové šťávy. Ve stejném obchodě nabízejí borůvkový džem Alnatura sélection Heidelbeere 70 Frucht, v němž je sedmdesát procent ovoce.

Naproti tomu na výrobku nazvaném Borůvka ovocná náplň, který na trh dodávala firma Pavel Cvrček, vůbec poměr ovoce uveden nebyl, navíc se ve složení objevuje škrob. Výrobce už tento výrobek na svých webových stránkách nenabízí, ale místo něj prodává třeba Brusinku ovocnou náplň a také její obsah blíže nespecifikuje. Obsah neuvádí ani u výrobků z rakytníku, které jsou jeho hlavní specialitou. Nemusí, jelikož je nedeklaruje jako džemy, jenže to si zákazník třeba vůbec neuvědomí.

Označení „extra“ by zato klidně mohl nést francouzský ostružinový džem prodávaný pod značkou St. Dalfour (mají i jiné příchuti), ostružin je v něm 51 procent. Výrobce nebo lépe řečeno dovozce se však spokojil s nápisem, že to je „Ovocná pomazánka s vysokým obsahem ovoce, bez umělých barviv, aromat a konzervačních látek.“

Marmeláda, nebo džem?

Džemy

  • všeobecně: ovoce minimálně 35 gramů/100 gramů
    (z červeného a černého rybízu, jeřabin, rakytníku, kdoulí a šípků 250, ze zázvoru 150, z kešu-jablka 160, z plodů mučenky (maracuja) 60)
  • extra, výběrové – všeobecně: ovoce minimálně 45 gramů/100 gramů
    (z červeného a černého rybízu, jeřabin, rakytníku, černého rybízu, kdoulí a šípků 350, ze zázvoru 250, z kešu-jablka 230, z plodů mučenky (maracuja) 80)

Marmelády (jen z citrusových plodů)

  • ovoce minimálně 20 gramů/100g

Džemy jsou plné ovoce, marmelády slabší

Z toho je zjevné, že etikety se vyplatí číst, protože někdy můžete být naopak překvapeni příjemně.

Borůvkový džem mají rovněž v IKEA – i ten by si vysloužil označení extra, byť těsně, ve sto gramech výrobku je 45 gramů borůvek, navíc ani tento džem neobsahuje příliš mnoho konzervantů – je v něm jen jablečný pektin (nezaměňovat s obsahem jablek, jde o přírodní zahušťovadlo, bez něj by byly džemy příliš řídké) a kyselinu citronovou. Rovněž v jejich brusinkovém džemu je 45 procent bobulí.

IKEA však nabízí i pomerančovou marmeládu a tam už je složení dosti sporné a rozhodně je na hraně toho, aby se o tomto výrobku vůbec jako o marmeládě dalo mluvit. Posuďte sami: Nepíše se tam totiž nic o ovoci, ale dvacet procent hmotnosti tvoří pomerančová šťáva, dalších devět procent pomerančová kůra, dalších osm procent extrakt z květů černého bezu. Ten sice výrobce přiznává velkým nápisem, ale jen ve švédštině. Vzadu je ale výrobek správně popsán i v češtině.

Hodně cukru je v pořádku

Marmelády i džemy jsou plné cukru, ale to je v tomto případě v pořádku – cukr tu vlastně slouží jako konzervační činitel. Sám o sobě by však nestačil, proto výrobci přidávají více či méně dalších látek – někteří si vystačí jen s pektinem a kyselinou citronovou (pozor, najdete ji někde i jako E330 aneb ne každé éčko znamená zlo), jinde však narazíte i na barviva jako je košenila či kyselina karmínová, může v nich být jako konzervant oxid siřičitý a někde přidávají také aromata. Je na vás, zda je v džemech či marmeládách snesete či ne.

Pokud jde o samotný cukr, někteří výrobci nahrazují řepnou sacharózu ovocnou fruktózou či hroznovým cukrem zvaným glukóza, ale na energetické vydatnosti této pochutiny se tím mnoho nezmění, stejně jako když výrobce sníží množství obsaženého cukru. Aby vůbec výrovek mohl vyrobit, potřebuje ho stále dost a dost. Trochu lepší je to u džemů slazených umělými sladidly – ty mají zhruba 300 kilojoulů na sto gramů výrobku, zatímco klasické džemy kolem tisícovky. Výrobky s fruktózou pak kolem sedmi set kilojoulů.

Rozhodně nevěřte nápisům „bez cukru“, které se objevují například na dia marmeládách. Ve skutečnosti jde totiž o cukr přidaný, a pokud v takovém džemu tvoří ovoce 60 procent hmotnosti a zbytek je doplněn přírodními sladidly, stále jde o výrobek energeticky velmi vydatný. Snížený obsah cukru navíc znamená, že se džem či marmeláda začnou dříve kazit.

Autor článku

Pro tištěná i webová média píše od poloviny 90. let. Ve svých textech se věnuje zejména rodinné problematice, výchově dětí, zdraví a životnímu stylu.

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