Menu Zavřít

Temu, Shein a ti další. České organizace bojují proti levným zahraničním online tržištím, poukazují na porušování předpisů a zdravotní rizika

30. 5. 2025
Doba čtení: 5 minut
Autor: Depositphotos
  • Stále více zdejších internetových obchodníků a organizací si stěžuje na porušování českých a evropských předpisů, kterého se mají dopouštět velká zahraniční online tržiště
  • Firmy jako Temu, Aliexpress nebo Wish podle nich nesplňují přísné normy týkající se složení, certifikace a označení výrobků, díky čemuž můžou zákazníkům nabídnout nižší cenu
  • Tato nekalá konkurence začala vadit i Evropské komisi, která už zahájila šetření vůči čínskému internetovému prodejci Shein

Nízká cena, ale za jakou cenu? I tak by se dala shrnout rostoucí kritika českých internetových obchodníků a organizací vůči zahraničním online tržištím typu Temu, Aliexpressu, Wishe, Sheinu či Trendyolu. Ty údajně na rozdíl od tuzemských společností nedodržují mnohé zákony a předpisy týkající se složení, certifikace a označení výrobků, kvůli čemuž na evropský trh proudí zboží s obsahem nebezpečných látek, jejichž složení či zdravotní nezávadnost přitom téměř nikdo nekontroluje.

„Tento stav není jen frustrující, ale především nebezpečný. Zákazník je klamán cenou a dostupností, a neuvědomuje si rizika, která s sebou takové zboží nese – například přítomnost zdraví ohrožujících bisfenolů, formaldehydu nebo ftalátů ve spodním prádle a oblečení,“ shrnul Ruslan Skopal, CEO a spolumajitel společnosti Trenýrkárna.cz.

Outstream Placeholder

Zmíněná tvrzení přitom rozhodně nejsou jen názorem českých firem, které se chtějí „zbavit“ levnější konkurence. Závažná bezpečnostní rizika výrobků z Temu či Sheinu potvrdilo několik nezávislých testů, jak v zemích Evropské unie, tak i jinde ve světě. Spotřebitelská organizace BEUC nedávno odhalila až 240násobné překročení povolené koncentrace ftalátů v dětských hračkách, zhruba 50krát vyšší pak byla koncentrace takzvaných věčných chemikálií PFAS v pečícím papíru a jednorázovém nádobí. Velmi podobně navíc podle Le Monde dopadly i další testy prováděné v Jižní Koreji.

„Temu si možná podmanilo Evropu díky nízkým cenám, ale zároveň se stalo vstupní branou pro nelegální produkty, jež na našem trhu nemají co dělat. Spotřebitelé si do svých domovů přinášejí nebezpečné výrobky, zatímco mnoho evropských podniků, které dodržují předpisy, čelí nekalé konkurenci. Proto vyzýváme Evropskou komisi, aby urychleně dokončila své probíhající vyšetřování a přijala účinná a odstrašující opatření proti Temu v zájmu spotřebitelů i poctivých podniků,“ okomentoval podle sesterského serveru Podnikatel.cz výsledky testování generální ředitel BEUC Agustín Reyna.

Nízká cena nestačí ani na poplatky

Expanze zahraničních online tržišť rozhodně není problematická jen kvůli zdravotním rizikům. Podle výkonného ředitele Asociace pro elektronickou komerci (APEK) Jana Vetyšky tyto firmy představují nefér konkurenci i kvůli obcházení cel a DPH, chybějícím manuálům nebo nehrazení různých poplatků. Jenže právě díky tomu mohou prodávat zboží za daleko nižší ceny než u výrobků, které by podmínky pro uvedení na evropský trh splňovaly.

Nakupujete na čínských e-shopech typu Temu a Shein?

„Jako příklad si můžeme uvést například paměťovou kartu o kapacitě 64 GB – z té je český obchodník povinen odvést jen na autorských poplatcích 90 korun. Na některých platformách je ale možné ji do Česka dodat v hodnotě nižší, než je i jen těchto 90 korun,“ řekl redakci Euro.cz Vetyška.

Velmi podobně pak situaci vnímá rovněž tuzemský Svaz obchodu a cestovního ruchu. Podle jeho ředitele Tomáše Prouzy jsou čínské e-shopy učebnicovým příkladem neférové konkurence, jež ohrožuje nejen zdraví spotřebitelů, ale i existenci poctivých evropských obchodníků. „Naši podnikatelé dodržují přísné normy a pravidla, zatímco některé zahraniční platformy je za tichého přihlížení kontrolních orgánů zcela obcházejí – a tím si zajišťují neférovou výhodu,“ uvedl Prouza v tiskové zprávě.

Stejně jako další hračkáře nás dnes nejvíc trápí neférová konkurence z Asie, říká výrobce Kloboučku, hop! i legendárního Igráčka
Přečtěte si také:

Stejně jako další hračkáře nás dnes nejvíc trápí neférová konkurence z Asie, říká výrobce Kloboučku, hop! i legendárního Igráčka

Zahraniční společnosti se samozřejmě těmto nařčením obvykle brání a tvrdí, že chtějí evropská pravidla dodržovat. „Jako jedna z předních e-commerce platforem je Trendyol odhodlán poskytovat záruku bezpečí a kvality při nákupu všem zákazníkům, ať už se nacházejí kdekoliv na světě. Zrovna minulý týden jsme byli v Bruselu, abychom podepsali Závazek na ochranu spotřebitele EU, tedy rámec dobrovolných závazků zaměřených na zvýšení bezpečnosti produktů a digitálních práv spotřebitelů. Připojením se k tomuto závazku znovu potvrzujeme naši dlouhodobou oddanost dodržování místních regulací a bezpečnostním standardům produktů v Česku i celé EU,“ sdělili zástupci tureckého online tržiště naší redakci.

Poplatek za balíčky a omezení výjimky

Mnohdy nekalá zahraniční konkurence samozřejmě „neštve“ jen tuzemské podnikatele, ale také další firmy napříč celou Evropou. Jejich volání nyní aspoň částečně vyslyšela Evropská komise, která zahájila formální šetření proti čínskému Sheinu kvůli podezření z rozsáhlého porušování spotřebitelských práv. Brusel této platformě vytýká především fakt, že prodává nebezpečné výrobky, systematicky nabízí falešné slevy, špatně informuje zákazníky, používá klamavé označování produktů a že zákazníci často mívají problém s kontaktováním jednotlivých prodejců.

České e-shopy letos vyhlížejí další růst. Jeho míru může negativně ovlivnit nekalá zahraniční konkurence i dražší přeprava
Přečtěte si také:

České e-shopy letos vyhlížejí další růst. Jeho míru může negativně ovlivnit nekalá zahraniční konkurence i dražší přeprava

Samotné vyšetřování je zatím teprve na začátku, avšak je zřejmé, že zajistit dodržování evropských pravidel zahraničními tržišti bude velmi komplikované. Do Evropy totiž denně míří více než 12 milionů balíčků od prodejců ze zemí mimo EU, přičemž kontrola tak velkého množství zásilek se prakticky nedá zajistit. I přesto je podle šéfa Trenýrkárny nutné, aby české a evropské kontrolní orgány v tomto ohledu vyvíjely větší snahu.

„Pravidla musí platit pro každého – bez ohledu na to, jestli zboží přichází od českého výrobce nebo z čínského skladu. A pokud už zákony máme, pak je potřeba je skutečně vymáhat. Stát by tedy měl zavést reálný dohled nad celým segmentem a vymáhat evropské standardy i na zahraničních digitálních platformách. Řešením může být například zavedení poplatku za každý balíček doručovaný ze zahraničních tržišť – ve výši, která by umožnila pokrýt náklady na kontrolu a zároveň odradila od distribuce nebezpečného zboží,“ doplnil Skopal.

CIF25

Kromě zmíněného poplatku šéf Trenýrkárny navrhuje i další opatření, jež by mělo pomoci situaci zlepšit. Jde o zrušení daňové výjimky na zásilky do 150 eur (asi 3 700 korun), což je limit, do něhož balíčky neprocházejí celním řízením, a tak se v podstatě vyhnou kontrole. K podobnému kroku nedávno přistoupily třeba Spojené státy, což ale paradoxně situaci v Evropě ještě zhoršilo, protože čínské firmy se od té doby více zaměřují právě na země EU.

Čínská platforma Temu čelí dalším problémům. Otázky ohledně kontroverzních obchodních praktik střídají protesty prodejců
Přečtěte si také:

Čínská platforma Temu čelí dalším problémům. Otázky ohledně kontroverzních obchodních praktik střídají protesty prodejců

Jak celá situace dopadne, zatím není jasné, záležet bude mimo jiné i na výsledcích aktuálního šetření Evropské komise vůči společnosti Shein. Oslovení odborníci se každopádně shodují, že evropští a čeští zákazníci by si měli uvědomit, že nakupování na zahraničních online tržištích s sebou přináší nemalá rizika.

  • Našli jste v článku chybu?
'; 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'; } }
'; 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 »