Kam s dětmi za kulturou, aby je to bavilo

20. 2. 2009

Sdílet

Ilustrační obrázek
Autor: Depositphotos – VadimVasenin
Ilustrační obrázek
Jak každý rodič ví, děti nikdy neposedí na jednom místě celý den, potřebují pohyb, hry a zábavu. Zatímco v týdnu se o ty nejmenší postaráme my, na větší dohlížejí učitelky v mateřských a základních školách. Co ale vymyslet na víkend? V létě se program vymýšlí jednoduše, když je pěkné počasí, horší je to však na podzim nebo v zimě.

Nevím, jak je to u vás, ale já musím víkendový program plánovat minimálně den předem, abych věděla, jestli budeme na oběd nebo večeři doma nebo si dáme něco na výletě, jak velké svačiny připravit a jakým dopravním prostředkem pojedeme.

Pomoc s vymýšlením zábavy pro děti začíná na internetu. Tam si najdu weby, ve kterých si po zadání dne, času, druhu a kraje vyhledám akci, která mě zaujala a věřím, že i mé děti ve věku dvou a pěti let.

Co je na výběr?

Divadla, akce obchodních center, show známých televizních tváří a nové filmy v kinech. Akce hotelů, organizací, kulturních a sportovních center. Muzea, výstavy, ZOO a Botanická zahrada, hvězdárna, cirkus, vodní světy atd.

Rodina-vztahy-děti-výchova-hraCo je největším tahounem, na co se nejvíce chodí?

Pokud se rozhodnete ze dne na den, tak se většinou už nedostanete na představení známých televizních tváří jako jsou Dáda Patrasová a Michal Nesvadba. Na ty se chodí tak trochu za odměnu, a proto si je taky najdeme s předstihem. Jinak není problém dostat lístky na cokoli.

Jak je to s akcemi a doporučeným věkem?

Většinou se za děti do dvou let neplatí, podmínkou je zaplacení dvou vstupenek. Děti vám sedí na klíně. Jinak až na jedno malé loutkové divadélko, kde jsem viděla, že si vysloveně přejí, abyste dodržovali věkové doporučení představení, je jedno, s jak starými dětmi přijdete. Například na Dádu se chodí i s miminky v kočárku, i když to není kvůli tomu, že už by i kojenci milovali Dádu, ale proto, že maminky nemají nikoho, kdo by jim mladšího sourozence pohlídal a pokud se na představení zpívá a hraje muzika, tak to tu hodinu děťátko vydrží.

Jak je to s přestávkami během představení?

Máme vyzkoušené, že akce by měly být dlouhé maximálně hodinu. Pokud je představení delší, většinou se po 45 minutách udělá přestávka, ale dětem pak dlouho trvá, než se po přestávce zklidní, takže to chce hodně síly zaujmout hned úvodem po přestávce.

Můj syn vydrží jakkoli kvalitní představení a jakkoli dlouhé. A pokud vidím, že už ho to opravdu nebaví, tak není nic jednoduššího, než se zvednout a odejít. Je to proto, že mám pochopení pro druhé, kteří si zaslouží nerušit, když si zaplatili drahé vstupenky. Dcera, které jsou dva roky, s námi pomalu začíná chodit, protože jednak má ráda asi jako všechny děti, když se něco nového kolem děje, a také má věk na to, aby něco viděla a chvíli to vydržela – a také proto, že nemám nikoho, kdo by malou pohlídal.

Představení začíná…

Hned úvodem platí jedna zásada: Přijít maximálně dvě minuty před představením, to je čas jen zajít si na toaletu, abychom nerušili během představení. A ve chvíli, kdy usedáme na místa, představení začíná.

Rodina-vztahy-děti-výchova-hra-představení-kino

Popíšu vám, jak se chová moje dcera během představení. Prvních deset minut sedí jako připínák, stejně jako ostatní děti. Pak se mě začíná ptát, co to je a kdo to je. Následuje seskok ze sedačky a setrvání v pozici „na stojáka“. Pak se začne otáčet čelem k pohyblivé sedačce a začíná s ní houpat. Nato jí začínají chybět tekutiny, nabízím nápoj, nejlépe ten, který má ráda  a ještě lépe, pokud ho má ve své oblíbené lahvi. Dále ji udržím na nějaké mňamce, pokud jsem ji nezapomněla vzít s sebou. Chvíli sedí, opět ji zajímá představení, sundá si boty (někdy chce i kalhoty a tričko). Pak si začíná měnit místo se svým bratrem, vydrží to jen chvilku, chce na své, pohádá se s bratrem. A když ji bratr dá najevo, že ho ruší, sedne si mě na klín. Abych udržela její další pozornost, popisuji ji šeptem do ucha co vidím a co se asi bude dít. Chvilku to vydrží, pak si zase stoupne a začíná laškovat s pánem, který sedí řadu před námi.

Upozorňuji ji, že nemůže nikoho rušit, pán se ale nudí stejně jako většina rodičů a přistupuje na její hru, chytá ji za ruku, dcera se začíná smát. Do hry vstupuje syn, který se také začíná nudit. Když si pohrají s pánem a nakonec s jeho dětmi, které představení také přestává bavit, začínají se ptát, kdy to skončí. Naštěstí se konec blíží, popřípadě jen přestávka. Pokud ne, dcera si vzpomene, že potřebuje čůrat. Z tohoto důvodu si rezervuji lístky na stranách řad. Když dorazíme na toaletu a dám dceru vyčůrat, někdy se jí to povede, někdy ne. Vracíme se zpátky na svá místa. Po pěti minutách chce kakat. Po dalších pěti minutách chce opět čůrat, dneska ale vím, že ji nejde vůbec o čůrání, ale začíná ji bavit, když chodí a nesedí na místě. Hurá, začíná přestávka. Jdeme se občerstvit a ještě během přestávky se rozhodneme, jestli ještě vydržíme, většinou je to ale jasné ještě před přestávkou.

Ale nekruťte prosím hlavou, jsou to akce, které jsou doporučeny od dvou let. A podobně jsou na tom i jiné děti, dokonce věkově starší. A ještě jiný příklad. Nedávno jsme byli na představení Michala Nesvadby v obchodním domě. Bylo tam k mému překvapení jen pár dětí, takže syn stál hned pod pódiem a dceru jsem měla na ramenou, protože se bála hlasité hudby, která byla součástí produkce. Dcera ani nemrkla a celé hodinové představení koukala, ani se nehnula – tedy to bych lhala, taky mi na ramenou tancovala. Byla z Michala nadšená a nebyla sama, kolem se zastavovali i dospělí a bavili se spolu s dětmi. Mezi námi, mnozí rodiče by mi potvrdili, že když je v televizi Kouzelná školka s Michalem, tak se dívají společně s dětmi.

Rodina-vztahy-děti-výchova-hra-loutky

Mám ale i takovou zkušenost, že si najdu akci, která má v názvu rodinná podívaná, jako byla nedávná show Apassionata. Děti koně milují, jezdí na nich, byla jsem si jistá, že je vystoupení bude bavit. Naštěstí jsem se nemýlila, ale jen jsme dosedli do sedadel, vedle nás seděly dvě dámy, které hned od počátku dávaly najevo, jak je bude dětská společnost rušit. Volala bych proto po toleranci z obou stran. Pokud se jedná o tak velkou produkci, jako byla Apassionata, a v hledišti jsou děti, ale i dospělí, tak rodiče by měli zhodnotit situaci, zda to jejich potomci zvládají a popřípadě odejít. A naopak dospělí by měli přimhouřit oko, když se dítě trochu pohne.

Výběr míst

Samozřejmě chceme svým dětem zajistit co nejlepší výhled, takže se ptáme na nejlepší místa. Je ale zvláštní, že například já se nesháním po lístcích hned, jakmile jdou do prodeje, ale ani ne na poslední chvíli, a když si otevřu možnosti nabízených volných míst, je vyprodáno jak vpředu – nejlepší místa, tak vzadu – ty poslední, takže místa někde uprostřed, za průměrné ceny, nám naprosto vyhovují. Vstupenky si většinou rezervuji přes internet, přes agentury a vyzvednu si je na jejich nejbližších pobočkách.

Cena vstupenek

Tak například za televizní hvězdy zaplatíte v průměru kolem 150 korun, za kino v Praze 120 korun za děti, 160 za dospělé, za cirkus 80 a 120, za divadlo od 50 do 120 korun. Cena za vstupenky není tak velká, abychom si vyčítali, jestli to vůbec stálo za to a popřípadě co bychom za peníze mohli pořídit jiného. Horší je to s tím, co na takových produkcích prodávají. Jsou to známé plyšové hračky, stavebnice, hry, magnetky, trička, svítící kroužky, omalovánky, pexeso. A domů samozřejmě nemůžeme jít s prázdnou, takže po občerstvení si domů odnášíme tašku plnou nových věcí a peněženku máme lehčí o pár stokorun.

Jaký je výběr

Když si vyhledáte akci pro děti například na sobotu, ukážou vám internetové stránky pět stran nabídky. Ne že by nebylo z čeho vybírat, jednu „slušnou“ akci si vždycky vyberete, když není zrovna okurková sezóna. Je dobře, že pokud se pro ni rozhodnete i v den akce, že vstupenky seženete, ale já mám spíš problém s tím, že pokud nejde o akci, kde máte vstupenky na místo, že jsou programy pro děti zavalené návštěvníky a otráví to jak dospělé, tak i děti. Jak to zařídit nevím, možná nějakou lepší organizací. Ale jsou i výjimky. Musíte hledat a doufat, že nebudete stát celé odpoledne ve frontách na každou atrakci. Popřípadě mít v záloze náhradní program, aby děti nebyly zklamané. 

Rodina-vztahy-děti-výchova-kůň-dostihy

Rozdíl bude také v nabídce v zimě, v létě a dalších dvou ročních obdobích. Také znám situaci pouze v Praze, kde je nabídka největší. Mimopražské akce větších produkcí zajišťují většinou kulturní domy, v časovém horizontu jednou za měsíc. V dnešní době také očekáváme dětský program v lyžařských střediscích nebo v hotelových komplexech u moře. Na dětskou klientelu se soustřeďují některé zahraniční ekofarmy nebo horské penziony. Cestovní kanceláře lákají na denní nebo víkendové pobyty v nejrůznějších zábavných parcích, Disneylandech a Legolandech. Pořádají speciální zájezdy pro rodiny s malými dětmi. Takže si myslím, že možnosti jsou bohaté a lákavé.

Autor článku

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