Test dětských kaší: Míchala myšička instantní kašičku

Autor: Vitalia.cz
Zamíchat s vodou či mlékem, nevařit! A dobrou chuť? Je to sice jednoduché a rychlé, ale ne vždy chutné či zdravé. Testováno na dětech.

Kaše, kaše a zase kaše. Základní kámen výživy pro kojence a batolata se už desítky let nemění. Zato samotná kaše doznala změn velikých, a to i za uplynulých deset patnáct let. Například se nevaří, což je na jednu stranu příjemný bonus, ale na druhou stranu se vkrádá otázka, zda děti od malička nekrmíme zbytečně průmyslově vyráběným jídlem.

Nevím jak vy, ale já krupicovou kaši při vaření často připálím. Dlouho se nic neděje a najednou je na nějaké pořádné míchání pozdě. Proto mě zase děsilo blížící se období dětských kaší u mého nejmladšího syna, protože si dobře pamatuji, jak jsem se kašemi ještě v 90. letech trápila u starších potomků, kterým navíc jen tak něco nechutnalo.

Jenže všechno je jinak, stačí vyrazit do jakékoli běžné drogerie, větší lékárny či zdravotnických potřeb nebo supermarketu a na výběr máte desítky instantních dětských kaší. A to i s příchutěmi, na které by mě u kojenců a batolat snad ani nenapadlo pomýšlet.

Zamíchala myšička instantní kašičku


Autor: Vitalia.cz

Instantní kaše obecně vzali na milost i zastánci zdravé výživy, záleží vždy na konkrétním složení

V redakci jsme se proto rozhodli, že je pro vás otestujeme – jejich přípravu, vzhled, chuť a samozřejmě také složení. Vybrali jsme kaše vhodné plus minus pro roční děti, tedy pro děti starší, než je uvedeno na obalech kaší. Kaše pro batolata od roku výše už se nijak dále nespecifikují.

Nápisy na krabicích mluví jasně: stačí přidat ohřátou vodu nebo mléko, zamíchat a podávat. Nic se nevaří. Dlužno ale dodat, že doporučujeme urychlené podávání, protože všechny instantní testované kaše se během pěti deseti minut změnily ve výrazně houstnoucí až tuhnoucí hmotu, kterou dítě nenakrmíte. Tohle vám klasická krupicová kaše nikdy neudělá. „Je ale pravda, že klasická krupicová kaše už se dneska pro děti do tří let nedoporučuje jako obtížně stravitelná, některé z nich po ní trpí bolestmi břicha,“ dodává ještě lékařka Jana Vondráková. Vadit může i kravské mléko, nicméně kaše se dá rozdělat i mlékem kojeneckým.

Pokud jde o konzistenci instantních kaší, můžete samozřejmě umíchat i instantní kaši řidší, jenže tu je ne každé dítě ochotné jíst.

Co jsme ochutnávali?

Krupicová kaše

Vitana, bez vaření, od 3 let, ale prodává se mezi kašemi kojeneckými a batolecími, upozornění je však jen malým písmem, zkušenost například z prodejny Billa, Lety u Dobřichovic

Stracciatella

mléčná kaše, Nestlé, od ukončených 8 měsíců

Kaše jáhlová

nemléčná, Alnatura, od ukončených 4 měsíců

Babylove Bio

nemléčná trojzrnná, privátní značka DM drogerie, od ukončených 6 měsíců

Sunarka Dobrou noc

mléčná kaše krupicová s medem, Hero, od ukončených 6 měsíců

Bio Na dobrou noc

mléčnoobilná kaše, jablečná s ovesnými vločkami, Hipp, od ukončených 7 měsíců

K cenám je ale třeba dodat, že použité množství instantní směsi na jednu porci kaše se u jednotlivých produktů liší. A je jasné, že se taky liší apetit dětí. Každopádně živit dítě kaší není nic levného. Už jen proto se vyplatí snažit se mezi výrobky dobře vybírat.

Tip navíc: Jakmile jednou dítě naučíte na kaše příliš sladké a výrazně chutnající, cestě zpět k jednodušším a levnějším výrobkům už není.

Pro alergiky to není

První postřehy? Pokud kupujete kaši nemléčnou, můžete se rozhodnout, že ji dítěti připravíte v přesně zvoleném umělém kojeneckém mléce; pokud má dítě například sklony k alergii, můžete zvolit mléko hypoalergenní, taková se dělají až do tří let věku dítěte. Přímo v kaších však bude nějaké běžné kojenecké, tedy mírně upravené kravské mléko. Hypoalergenní kaši dělá pouze firma Nutrilon, jde o neochucenou rýžovou kaši od čtvrtého měsíce věku, kterou jsme netestovali.

Zarazilo nás také, že hned několik kaší (mléčnoobilná Hipp, trojzrnná Babylove) se chlubí tím, že obsahuje celozrnné obilniny či ovesné vločky, které se přitom dětem kolem jednoho roku věku dávat nemají, protože je ještě neumí strávit. Ovšem zde hraje nejspíše roli instantní podoba kaší, která i z těchto druhů potravin dělá stravitelnější.

Na druhou stranu se například jáhlová kaše od Alnatury prezentuje na obale tím, že neobsahuje lepek neboli gluten. To rozhodně odpovídá několik let starým doporučením, kdy se tradovalo, že děti pod jeden rok věku by lepek neměly dostávat. Nyní už se od toho upouští. „Dítě by lepek mělo dostat ještě před půl rokem věku, ideálně, dokud je jinak plně kojeno,“ doporučuje imunoložka a alergoložka Sausen Sládková. Podle ní se právě díky tomu snižuje riziko, že se u dítěte v pozdějším věku rozvine alergie na lepek. Je ale rozhodně možné bezlepkové kaše kombinovat s lepkovými, a ani čistě použitým bezlepkových nemusíte udělat zásadní chybu. 

Chutnalo? Jak co

Z každé kaše jsme dle návodu připravili malou misku, kterou ochutnal jak můj roční syn, pokud to bylo vhodné, tak starší děti a dospělí, abychom mohli kaše lépe popsat. Je pravda, že všechny se připravují velice snadno, ale pokud se při míchání zamyslíte, snadno v nich uděláte žmolky, hrozilo to zejména u krupicové Vitany a žmolkovitá byla také trojzrnná kaše Babylove. Některým dětem to nevadí, ale jiné vás s takovou kaší pošlou do háje. Nezvyklou konzistenci má také mléčnoobilná kaše Hipp s jablky a ovesnými vločkami, připomíná spíše klasickou ovesnou kaši než typicky hladkou kaši pro nejmenší děti.

Velké rozdíly jsme však zjistili ve složení kaší, a proto se na ně podíváme podrobněji.

Krupicová kaše Vitana

Jejím základem je upravená pšeničná mouka, hned na druhém místě se ve složení objevuje cukr (zřejmě řepný, není blíže specifikovaný) a po něm ještě pět procent pšeničné krupice. Jelikož je to kaše určená o něco starším dětem, už tu neplatí tak přísné normy a výrobce proto upozorňuje na možné stopy vajec, mléka, celeru a také vlčího bobu.

Jak chutná: ačkoli obsahuje cukr, na chuť příliš sladká není, což jí lze přičíst k dobru, protože některé testované kaše určené menším dětem byly mnohem sladší. Výrobce ostatně doporučuje její doslazení a také ochucení máslem. Batole neochutnávalo, ostatní se shodli, že klasická krupicová kaše chutná lépe.

Při přípravě bylo těžší ji rozmíchat do hladka.

Stracciatella Nestlé

Rovněž tady je základem upravená pšeničná mouka a krupice, dále kaše obsahuje celou řadu látek, jako bílkoviny mléčné syrovátky či blíže nespecifikované rostlinné oleje; mně osobně se v ní moc nelíbí sojový lecitin a umělé vanilinové aroma.

Co zarazilo především, je vlastní příchuť, protože kaše obsahuje kousky mléčné čokolády, ačkoli čokoláda se dětem do tří let pokud možno nemá dávat vůbec. Může je alergizovat a některé děti jsou navíc po čokoládě divoké a špatně spí.

Obsahuje i neupřesněné množství probiotických bakterií, pokud však budete kaši připravovat v příliš horké vodě, zahubíte je. Obsahuje také železo a zinek.

Jak chutná? Batole z ní nijak nadšené nebylo, je sice sladká, ale celkem mdlé chuti a čokoláda mu je cizí. Ani starší děti ji příliš neocenily. Výhodou je ale snadná příprava a rozmíchání do hladka.

Kaše jáhlová Alnatura

Obsahuje celozrnnou jáhlovou mouku z ekologického zemědělství a vitamín B1, toť vše, proto se dá bez obav doporučit, nejsou v ní žádné konzervanty, barviva ani přidaný cukr.

K přípravě této kaše musíte použít mléko, u dětí starších jednoho roku bez sklonů k alergiím lze i kravské, kvůli opatrnosti se však doporučuje kojenecké.

Jak chutná? Sama o sobě nemá skoro žádnou chuť, takže pokud už je dítě zvyklé na jiné jídlo, neoslníte ho s ní, ale pokud s kašemi teprve začínáte a rozděláte ji dítěti v jeho oblíbeném mléce, může mu zachutnat. Náš syn ji jedl samotnou, ale teď už je vybíravější, proto mu ji míchám s nějakou mírně doslazovanou kaší.

Babylove Bio nemléčná trojzrnná

Celozrnná ovesná mouka, celozrnná mouka z ječmene a celozrnná špaldová mouka. Všechny z biologického zemědělství, žádná barviva, na rozdíl od jáhlové kaše však přirozeně obsahuje lepek.

Také k přípravě této kaše musíte použít mléko podobným způsobem, jako je uvedeno u jáhlové kaše Alnatura.

Jak chutná? Jelikož obsahuje tři druhy obilovin, je sama o sobě chuťově zajímavější než samotná jáhlová kaše, její chuť lze ovlivnit i použitím vhodného mléka. U nás zaujala, když se do ní přidaly čerstvé jahody nebo banán. Hůře se rozmíchává. Hodí se například ke snížení sladkosti některé hodně sladké kaše.

Sunarka Dobrou noc, mléčná kaše krupicová s medem

Výčet všeho, co obsahuje, je poměrně dlouhý, krom obligátní mouky, sušeného mléka (obsahuje dva druhy mléka, jen u jednoho je však napsáno, že jde o mléko kojenecké) v ní jsou i různé vitamíny a minerály, která se však v celozrnných moukách mnohdy vyskytují přirozeně.

Je v ní také pět procent medu, který bývá řazen mezi alergizující potraviny, a proto se jeho použití v dětské výživě obvykle do roka či dokonce do tří let nedoporučuje. Přesto se na výrobku objevuje doporučení Sdružení praktických lékařů pro děti a dorost ČR, pozor, to je však spíše profesní sdružení a nemělo by se zaměňovat s odbornou pediatrickou společností.

Ve složení samozřejmě nechybí ani neupřesněné množství cukru a dokonce ani vanilková příchuť (umělá, docíleno vanilinem), která je přitom u medově mléčné kaše nadbytečná.

Jako plus vidím vlákninu a probiotika, proto by se neměla připravovat v horké vodě, a také fakt, že neobsahuje konzervanty a barviva.

Jak chutná? Je to chuťový vítěz testu u našeho ročního syna, ale doufám, že si tuhle chuť nechá ještě nějaký čas zajít, je skutečně dost sladká a tak připomíná spíše nějakou pochoutku než běžné jídlo.

Mléčnoobilná kaše na dobrou noc, Hipp

Je to spíše mléčná výživa než kaše, na prvním místě ve složení je totiž mléko a až pak rýžová mouka (že je kaše rýžová se však na obale v hlavním názvu nedočtete), obsahuje také krupici, ovesné vločky a spoustu vitamínu, minerálů a stopových prvků a omega mastné kyseliny.

Mléko a mouky jsou z ekologického zemědělství, kaše má proto loga dokládající, že jde i biovýrobek.

Jablka v ní jsou pouze v prášku, jsou jich tu tři procenta.

Plus má za to, že v ní není přidaný cukr, aromata, barviva a konzervační látky, ani tady si sice neodpustili vanilkovou příchuť, ale použili k ní extrakt z pravé bourbonské vanilky.

Jak chutná? Má pro nejmenší děti poměrně hrubou konzistenci, což je dáno jejím složením, nikoli tím, že by nešla rozmíchat. Tomu odpovídá i její vyobrazení. Chutná však po jablkách a je přirozeně sladká, takže se dá čekat, že ji děti přijdou na chuť.

Jak se vlastně vyrábí instantní kaše?

Instantní kaše jsou rovněž z obilnin, jako jakékoli jiné – mohou být z pšenice, ale běžně také z ovsa, pohanky či jáhel. Vyrábí se za pomocí technologie zvané extrudování, při níž se původní surovina zpracovává za vysoké teploty a tlaku s tím, že se do ní navíc přidává voda. Instantní kaše se takto extrudují z již namleté mouky. Výsledkem této úpravy je, že směs pak stačí jen zalít horkou nebo teplou vodou a takto upravený cukr neboli škrob se lépe stráví.

Instantní kaše přitom vzali na milost i zastánci zdravé výživy a běžně se dají koupit – už většinou nikoli a priori určené dětem i v takto zaměřených prodejnách. To, co z této kaše může učinit výrobek spíše nezdravý, je přidávání různých barviv, éček nebo množství cukru.

Jaké jsou vaše zkušenosti s kašemi pro děti?

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.

OSZAR »
--> '; 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ě).
\n<\/ins>\n--> '; 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 »