Některé děti si myslí, že bolest je při psaní normální

17. 8. 2017

Sdílet

Autor: Albert
Možná budete překvapeni, jak moc platí o psaní, že všechno souvisí se vším. To, jak jednou bude dítě psát, ovlivňuje řada faktorů; a to, jak píše, má zase vliv nejen na známky ve škole, ale i na zdraví a psychiku školáka.

Martina Simonidesová se věnuje specifickému oboru zvanému grafomotorika. Navazuje na řadu dalších oblastí a shrnuje a využívá všechno to, co potřebujeme ke psaní. Těchto funkcí je opravdu mnoho. Než dítě začne psát, potřebuje mít rozvinuté zrakové a sluchové vnímání, motorické funkce – jemnou i hrubou motoriku. „Jakmile má dítě nějaké potíže ve fyzickém vývoji, téměř vždy se to odrazí na jemné motorice. Projeví se svalová ochablost (hypotonie), i naopak zvýšené svalové napětí. Jemná motorika prstů je vrchol dovedností, takže když má dítě problémy někde ‚dole‘, u základů, samozřejmě se to projeví,“ říká odbornice.

Ve vlastním zájmu: Co by měl umět předškolák

Důležitými faktory jsou pravo-levá orientace a prostorová orientace. Předškolák by měl zkrátka bezpečně vědět, kde je vpravo nahoře.

Roli hraje také vizuomotorická orientace – spolupráce oka a ruky. Když má dítě dostatečně rozvinuté zrakové a sluchové vnímání, motorika na ně naváže. Zrak zpracuje, co vidí, a ruka dostane informaci, co nakreslit. A tím, že to dělá často, dovednost se rozvíjí. Od čmáranic a koleček postupuje dítě dále, až musí být ve škole schopno u prvních písmenek poznat, kudy vede cesta: Tudy nahoru, dolů, tady udělat smyčku, pokračovat, napojit další písmenko… „Je to vlastně složitý proces. Když nakreslím pěti-, šestiletému dítěti smyčku, málo z nich s tím má zkušenosti, neumí to. Ve škole to bude dělat každý den, dvě, tři hodiny denně. Bude psát, kreslit, vybarvovat a tyto funkce musí mít dobře rozvinuté – jinak ho mohou čekat potíže.“

Levá, pravá, přední, zadní, pozor, kozle, neupadni

S grafomotorikou souvisí i lateralita, dominance párových orgánů. U psaní se jedná hlavně o ruku a oko, ale také ucho, noha prý není tak důležitá. „Pokud má dítě nakombinovanou dominanci, třeba levé oko a pravou ruku, trochu se mu komplikuje spojení. Pohyb třeba napodobuje obráceně nebo mu déle trvá, než informaci zpracuje,“ popisuje Martina Simonidesová.

Když je dominantní oko a ruka na jedné straně, říká se tomu souhlasná lateralita, pokud jsou na opačné straně, jde o lateralitu zkříženou, čímž se komplikuje cesta dítěte ke psaní. „Je to vrozené. Není to diagnóza, ale normální stav, který však přináší všelijaké potíže,“ říká grafomotorička. Rodiče těchto dětí dobře vědí, že zkřížená lateralita komplikuje nejen psaní či kreslení, ale také omezuje při sportu nebo hře na hudební nástroje apod. Podle Martiny Simonidesové lze jedině posilovat a procvičovat to, co dítěti nejde. „Některé děti jsou bystré a kompenzují tuto skutečnost velmi zdařile, jiným se to tolik nedaří.“

Na dětech poznám, jestli jen sedí u tabletu

Pro všechny děti je proto prospěšné, aby od malička dostávaly co nejvíce podnětů; mohou malovat, stříhat, lepit, zavazovat tkaničky i stavět hrady z písku, prostě zkoušet, která ruka je ta šikovnější, a rozvíjet dovednosti. V tom je podle odbornice zrada mobilů a podobných „hraček“. „Když děti ve třech letech klikají, místo aby čmáraly na papír, nedostávají potřebné podněty. Je to hodně pasivní a mozek tolik nepracuje, z dítěte vyroste předškolák a má problém.“

Podle jejích zkušeností mají technologie na dovednosti dětí rozhodně vliv: „Troufám si říct, že na dětech je poznat, zda mají vhodné podněty, jsou zručné. Je to o zkušenosti. Možná se naučíme, co budeme chtít, když to budeme dělat. Když budeme mít příležitost a někoho, kdo nám k tomu pomůže. Můžete být nešikovní, ale stejně se to naučíte,“ říká. Třeba tkanička je dobrá ukázka takové cesty. Rodiče dítěti ukáží, jak na to, jednou, dvakrát, dvacetkrát, tuhle kličku přes tuhle… a dítě to s přestávkami zkouší, vracíte se k tomu, až je jednoho dne bota zavázaná.

Patlá a čmárá

Oklikou přes tkaničku se ještě vraťme k tomu, co všechno souvisí se schopností naučit se dobře psát.

Na grafomotoriku dítě často doporučí logopedi. Pokud má totiž předškolák problémy s řečí, odrazí se to i ve psaní a také v kreslení. „Logoped obvykle zkusí s dítětem kreslit. Kresba mu řekne hodně o tom, co se děje ve vývoji.“ Občas dítě přijde na doporučení poučeného pediatra, jindy z pedagogicko-psychologických poraden či od pedagogů. Výjimkou jsou čtyřletí špunti, u nichž je už tou dobou patrné, že nastane nějaký problém, nejvíce je však předškoláků a dětí z první až třetí třídy. Ojediněle přijde i žák před střední školou, který potřebuje pomoci před přijímačkami, nebo třeba středoškolák s dysgrafií.

Řeknete si, no a co, tak nebude psát krasopisně. Krasopisně ve finále píše ostatně málokdo. V první třídě se naučíme pracně kroužit vzorná písmenka (tedy někteří), abychom je pak postupně opouštěli, deformovali a přecházeli k dospěláckému škrabopisu. Dnes navíc téměř vyloučenému z běžného života používáním moderních technologií. O krasopis tady ale tak nejde. Pokud dítě špatně píše, ve škole nestíhá; a to může vést k psychickým i fyzických projevům, vedle toho, že bude neprávem za hlupáčka.

Psaní souvisí i s psychikou

Psaní zásadně souvisí s psychikou, když jste unavení, ve stresu, nevyspalí, klepe se vám ruka a nemůžete se doslova či obrazně ani podepsat. Podle Martiny Simonidesové se osobnost a psychické rozpoložení školáka projeví i na tom, jak píše: „Když je dítě hyperaktivní, nemůžeme po něm chtít, aby se trefovalo do linky, jiné dítě písmenka vyloženě kreslí. Ty rozdíly jsou veliké.“

Podle jejích zkušeností se na psaném projevu vždy projeví poruchy typu ADHD (porucha pozornosti s hyperaktivitou) či autismus. „Rodiče ale uklidňuji. Pojďme si říct, co dítě může zvládnout. Potřebuje psát tak, aby to bylo k přečtení, správně, a aby vědělo, k čemu se to psaní vůbec učí, k čemu je užitečné.“ Rodičům doporučuje zavést například rodinný či výletní deník, který bude mít dítě na starosti. „Ať si tam píše s chybami, fixou, čímkoli, je to úplně jedno. Jen ať vidí, že je to k něčemu užitečné a že to může být fajn.“

Písemný projev může také upozornit okolí na dosud neodhalený problém. Třeba když u dítěte s délkou testu přibývá chyb, může to značit poruchu pozornosti – nedokáže se tak dlouho soustředit. „Hyperaktivní dítě má i písmo takové rozhýbané. Úzkostné dítě také poznáte, snaží se psát za každou cenu perfektně, zadržuje u toho dech, má i fyzické potíže, protože se mu přetíží ručička. Má strach, že udělá chybu. Takové dítě je prakticky každý den ve stresu a psaní úzkost ještě vyvolává, takže je to takový začarovaný kruh,“ popisuje grafomotorička.

Může se stát, že dítě, které jde do školy dobře rozvinuté, jen je třeba narozené až v létě a trochu nezralé, se „pokazí“. Ve škole se mu nelíbí, objeví se nervozita, napětí. A v tomto napětí je každý den, trvá dlouho a nakonec se přenese i do paže a do fyzické roviny.

Při psaní ruka bolet nemá

Pokud dítě píše špatně, má ruku křečovitě sevřenou. „Je zajímavé, že mnoho dětí si tu bolest vůbec neuvědomuje a zřejmě ji považují za normální. Myslí si, že ruka u psaní má bolet, nikdy se jich na to nikdo nezeptal,“ zjistila ve své praxi Martina Simonidesová.

Dává dětem úkol, při kterém se to projeví. „Dítě napíše jednu řádku v písance jakž takž, pak ho začne bolet ruka, a to až do křeče. Dítě se tak dostane do stavu, kdy už nemůže psát. Jakmile máte ruku v takovémhle stavu, celé tělo začne samozřejmě úplně jinak reagovat. Dítě se pak obtížně soustředí na obsah, na nějaká tvrdá a měkká i, je z toho velmi rychle unavené, přetížené.“

Problém většinou „bouchne“ na konci druhé nebo na začátku třetí třídy. Dítě by tou dobou již mělo psát samozřejmě a věnovat pozornost a úsilí další látce – jenže ono pořád musí vynakládat veškeré síly na psaní. „Děti jsou pak pomalé, bolí je velmi často hlava. Vezměte si, kolik hodin denně takto stráví. Rodiče s nimi běhají po lékařích, kteří nic nezjistí, obvykle jsou to psychosomatické obtíže.“

Dobrá židle a dobrá tužka

Hodně dětí má také problémy se sezením: „Mnoho školáků posílám na rehabilitace, protože vidím, že jedno ramínko je výš, dítě nevydrží sedět, sedí zkroucené, položené na stole… Počátek je často už někde ve vývoji, rodičů se pravidelně ptám, jestli dítě dostatečně a správně lezlo, to je úzce spojené,“ popisuje grafomotorička. Dětí, které k ní chodí a mají problémy v oblasti fyziognomické, je prý opravdu hodně. Mezi klienty je také řada dětí s hypotonií: „Dítě má ochablé svaly a my po něm chceme, aby psalo, to je velmi těžké.“

Když dítě nemá možnost dobře sedět a chceme po něm, aby napsalo krasopisně domácí úkol, ubližujeme mu. Dítě musí mít možnost správně sedět. Než koupit mrňousovi tablet, kupte mu dobrou „rostoucí“ židli a hromadu pastelek, stavebnice, kostky, cokoli, co ho naučí pracovat s rukama.

Správné psaní mohou ovlivnit i správné pomůcky, ale pořád jsou to „jen“ pomocníci. Nevhodná pomůcka, třeba velmi tvrdé pastelky, na které musí dítě hodně tlačit, může vadit. Pomůcky hodně pomohou. Třeba ergonomické pero přiměje dítě, aby ho drželo správně, protože jinak prostě nepíše. Můžou pomoci, podpořit, ale většinou samy o sobě problém nevyřeší,“ upozorňuje Martina Simonidesová. Pokud jde o pomůcky, doporučuje odbornice v prodejně v klidu vyzkoušet, co dítěti vyhovuje. Ve spolupráci s řetězcem Albert připravila také tipy na zdravé sezení a držení pera, grafomotorická cvičení a video Jak na správné psaní. Zájemci mohou také online prozkoumat její podrobné hodnocení psacích pomůcek v testu na webu www.grafomotorika.eu.

Mgr. Martina Simonidesová

Absolvovala Filozofickou fakultu UK, obor pedagogika. Státní zkoušku složila z pedagogického poradenství a školní pedagogiky. Absolvovala praxi u Marty Veselé, která se dlouhodobě zabývá nápravou grafomotorických obtíží u dětí předškolního a školního věku. Zaměřuje se na nápravy grafomotorických obtíží a v pražských Modřanech vede grafomotorickou poradnu, kde pomáhá dětem, které mají problémy se psaním, www.grafomotorika.eu.

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 »