Autor Zpráva
peta
Profil
http://axpsu.fpf.slu.cz/~web/fpf-shadowbox/popup_fpf.htm

Potreboval bych tam dodelat, aby se po ukonceni videa shadowbox zavrel. Neresil jste nekdo neco podobneho? Zkousel jsem vse mozne, ale zatim bez uspechu, veskere pokusy o eventy mi to ignoruje, netusim proc. Nebo, nevite o nejakem prikladu, kde to funguje s youtube videem a zavre pak shadowbox?

Zdroj videa je content: 'http://www.youtube.com/v/S8zDFV9ATAc&list=PLbOKWJ2wSJciT2Ev-IFQNh1HRBc4ml3Pa&rel=0&autoplay=1',
Zavreni je Shadowbox.close();

var par =
  {
  flashParams :
     {
     //   'allowScriptAccess' : true
     'allowScriptAccess' : "always" //zkousel jsem true i always a nic
     }, 
  onFinish : function()
     {
     alert(document.getElementById( Shadowbox.player.id ).addEventListener) // vypise, ze existuje
     document.getElementById( Shadowbox.player.id ).addEventListener("state","function(obj){alert('stopped');}") // nevypise nic
      }
}

Shadowbox.init(par);

Dale jsem narazil na tyto zapisy a a tez mi ani jeden nefungoval.
document.getElementById( Shadowbox.player.id ).addControllerListener("state","stateTracker");
player.addEventListener(MediaEvent.JWPLAYER_MEDIA_MUTE, muteTracker)
Shadowbox.player.addControllerListener("state","stateTracker")
Jan Kupka
Profil
Radím začít načisto. Zdrojový kód na odkazované stránce je totální zmatek. Stránka nemá žádnou strukturu, plácá se tam jedno přes druhé.

Co se týče kódu, který jsi sem pastnul - callback onFinish dělá něco jiného, než si patrně myslíš. Podívej se ještě jednou do dokumentace Shadowboxu - www.shadowbox-js.com/options.html. Proč přidáváš listener na event s názvem "state"? Co ho spustí?

Chceš provést akci po ukončení videa z YT, tzn. budeš potřebovat nějak pracovat s jejich Player API, v kódu ale nic takového nevidím. Podívej se, jak API funguje - https://developers.google.com/youtube/js_api_reference.
peta
Profil
Jan Kupka:
Ja si myslim, ze callback on finish se spusti v okamziku, kdy se vykresli okno shadowboxu. Co sis myslel, ze si myslim, vubec netusim. Navic mam vyzkousene, ze pokud to nema finish, tak tam player neni vytvoreny pres api shadowboxu.

Google api jsem si vcera tez nasel . Dal ulozit na disk a tim to zkoncilo, z disku to spustit nejde. Po prozkoumani to tam cpe asi dalsi 4 scripty. Coz mne teda dost otravilo, hledat, proc mi to najednou nejede a u nich na webu jo. To si necham jako posledni moznost.

Proc bych potreboval jejich player API? Ja si ten stav muzu sledovat sam. Nic jineho sledovat nepotrebuji. To api resi kompletni prehravani, stavy, kvalitu a jine veci, to nepotrebuji. Samozrejme to zvazuji jako jednu z moznosti, pokud to jinak nerozfakcim.

Mi to nedela, co to delat ma, takze cistotu kodu neresim.

Co ocekavam od toho state? To je jeden z pokusu. Treba ani toto mi nejde:
http://stackoverflow.com/questions/10203100/how-youtube-api-to-fire-javascript-event-when-start-playing


Ha, objevil jsem funkci example s YT api. V nejhorsim pouziji u shadowboxu iframe player, pokud by to neslo zkloubit.

<div id="ytplayer"></div>
<div>State: <span id="ytvideoState"></span></div>

<script>
// Load the IFrame Player API code asynchronously.
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/player_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
 
// Replace the 'ytplayer' element with an <iframe> and
// YouTube player after the API code downloads.
var player;
function onYouTubePlayerAPIReady() {
  player = new YT.Player('ytplayer', {
    height: '390',
    width: '640',
    videoId: 'g8evyE9TuYk',
    events: {
      'onStateChange': "onytplayerStateChange"
    }
  });
}

function onytplayerStateChange(e) {
    document.getElementById('ytvideoState').innerHTML = e.data;
}
</script>
_es
Profil
peta:
aby se po ukonceni videa shadowbox zavrel.
Proc bych potreboval jejich player API?
A ako chceš reagovať na ukončenia videa bez toho API?
peta
Profil
_es:
To neni php ani swf, ale js api. Co je v tom api si dokazes obslouzit i sam. Tva otazka nedava tedy smysl, bez toho api se da obejit.

Pomoci YT api to mam uz vyresene jako shadowbox player: 'iframe'. Az na to, ze ti to natlaci do stranky:
http://www.youtube.com/player_api (0.4k js)
//s.ytimg.com/yts/jsbin/www-widgetapi-vflReMqMy.js (6,5k js)
http://www.youtube.com/embed/S8zDFV9ATAc?autoplay=1&amp;rel=0&amp;wmode=transparent&amp;enablejsapi=1 (6k html)
http://s.ytimg.com/yts/cssbin/www-embed-vflINP3Pd.css (27k css)
http://s.ytimg.com/yts/jsbin/www-embed_core_module-vfl3QV3p6.js (29k js) 
cca 70k jenom kvuli tomu, abys mohl pouzit 100 znaku kodu, ktery zjisti stav videa. Urcite to jde napsat i 100 znaky a tech 70k bys usetril.
Jan Kupka
Profil
peta:
Pokud jsem to správně pochopil, chceš v Shadowboxu přehrát embedované video z YT. Tzn. otázka _es je na místě a smysl rozhodně dává, protože bez YT API se nemáš jak dozvědět, že přehrávání videa skončilo. Stejně tak je to v případě, že bys zdrojové video z YT vypreparoval, uložil k sobě a využil k jeho přehrání nějaký vlastní přehrávač - zase musíš pracovat s API toho přehrávače, který ti dá echo, že video dohrálo.

Nastavit to tak, aby se Shadowbox zavřel po skončení videa není nic složitého. Otevřeš Shadowbox se správným contentem (URL k videu ve formátu YT API), nastavíš vytvořenému objectu parametr s názvem "allowScriptAccess" na hodnotu "always", v onYouTubePlayerReady() na ten objekt přidáš listener na událost "onStateChange" a v příslušném handleru budeš kontrolovat, zdali je aktuální "state" roven 0 a pokud ano, tak zavoláš Shadowbox.close.

V dokumentaci k Shadowboxu a v odkazu na YT API, který jsem uváděl v druhém příspěvku máš vše potřebné. Zkus to dát dohromady a pokud si nebudeš vědět rady, tak někam nahraj, co jsi vymyslel (pokud možno bez nepotřebných věcí kolem a stránce dej správnou strukturu).

Dej si pozor na dvě věci:

1) Metoda addEventListener v YT API se liší od klasické addEventListener a má trochu jiný syntax.
2) S YT API musíš pracovat na webserveru, důvod najdeš hned v první žlutě zvýrazněné větě v sekci Getting started na stránce s YT API.
peta
Profil
Jan Kupka: Zasláno: Včera, 10:34:59 "Pomoci YT api to mam uz vyresene"
Ale dik za snahu. :)
Stale nechapu, proc to API potrebuji. Vsichni tvrdite, ze ho potrebuji. Proc?
"bez YT API se nemáš jak dozvědět, že přehrávání videa skončilo"
Proc? Jak to? To api je javascript. Jedie, co z toho javascriptu potrebuji je pouzit addEventListener a spravnou udalost, ne? Nebo, jak to api funguje, proc je nutne ho pouzit nebo jemu obdobnou verzi?
V tom linku nahore mi shadowbox video prehraje. Je v tom uplne vsechno (prehravac stranky (iframe), fotek (image) nebo object-embed (swf)). Jedine, co jsem nedocil je prave ziskani te udalosti stavu videa.
Nebo je nejake bezpecnostni opatreni prohlizece, ktere zakazuje objektu vracet udalosti ze swf, pokud se neprehrava na domovske strance youtube? Aspon tak mi pripada, ze to api funguje, kdyz to otevira do iframu.
_es
Profil
peta:
Stale nechapu, proc to API potrebuji. Vsichni tvrdite, ze ho potrebuji. Proc?
Lebo prehrávanie videa je z tvojho pohľadu, až na nejaké výnimky ako trebárs možnosti z HTML5, „čierna skrinka“ a nemáš do nej ako vidieť.

Proc? Jak to? To api je javascript.
Javascriptový kód, spravený niekým, kto tú „čiernu skrinku“ spravil. Ak sa prehráva cez Flash, tak nejde len o čisté JS, ale o JS kombinované s prístupom k Flashu.
Jan Kupka
Profil
peta:
Přes addEventListener přidáš listener na nějakou událost. Jinými slovy - až nastane tahle událost, udělej tohle. To, že nějaká událost nastala, ti dá právě vědět to YT API skrz jejich custom eventy. Zkus pohledat, jak funguje publish/subscribe, příp. observer pattern.

Jinak já jsem ti psal postup pro klasické Javascript API, které pracuje s embedovaným objektem (swf player v Shadowboxu) a ne iframe, i když princip je podobný.
peta
Profil
Tak, ten kod YT, co jsem napsal nahore jsem s player swf neumel zkombinovat. Soucasna funkcni verze vypada takto, uz to mam na webu.
http://www.slu.cz/fpf/cz/

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: