Autor | Zpráva | ||
---|---|---|---|
regvac Profil * |
#1 · Zasláno: 24. 4. 2013, 11:42:56
Mám dotaz, mám zjednodušeně tento kód pro přehrání playlistu a následné spuštění funkce. Vše pracuje ok jen pokud prohlížeč umí (může) přehrát soubor. Potřeboval bych, aby se tato funkce také spustila i pokud audio soubor neexistuje nebo ho není možné přehrát (třeba není podporován prohlížečem). Celé to má fungovat tak, že kliknutím na nějaký odkaz se přehraje zvuk(playlist zvuků) a poté se např. přejde na jinou stránku. Vše by mělo také fungovat offline (na localu).
<div onclick="fce='loc';myPlayList = new Array('1.mp3','2.mp3');playsound();">odkaz</div> <script type="text/javascript"> var myPlayList = new Array(); var current, audioPlayer, audioPlayer_ogg, audioPlayer_mp3 var audioTagSupport = !!(document.createElement('audio').canPlayType); var myAudio = document.createElement('audio'); if (myAudio.canPlayType) { var canPlayMp3 = !!myAudio.canPlayType && "" != myAudio.canPlayType('audio/mpeg'); var canPlayOgg = !!myAudio.canPlayType && "" != myAudio.canPlayType('audio/ogg; codecs="vorbis"'); } function play_song(){ audioPlayer = document.getElementById('audioPlayer'); if (cs < myPlayList.length) { current = myPlayList[cs]; if (canPlayMp3) {audioPlayer.src = current;} if (canPlayOgg) { current = current.replace("mp3","ogg"); audioPlayer.src = current; } audioPlayer.play(); cs++; } else { if (fce != null) {window[fce]();} } } function playsound() { cs = 0; if (audioTagSupport) {play_song();} else if (fce != null) {window[fce]();} } function loc() { window.location.href = 'index.htm'; } window.onload = document.getElementById("audioPlayer").addEventListener("ended", play_song, false); </script> |
||
_es Profil |
#2 · Zasláno: 24. 4. 2013, 12:18:09
regvac:
„aby se tato funkce také spustila i pokud...“ Aká funkcia? Funkcia playsound sa ti predsa spustí. Akurát nie je jasné, čo sa snažíš dosiahnuť tým fce='loc'; window[fce](); a pod. A prečo si v kóde vyrábaš taký zmätok, že tam máš funkciu playsound aj funkciu play_sound .
|
||
regvac Profil * |
#3 · Zasláno: 24. 4. 2013, 12:48:41
_es:
„Aká funkcia? Funkcia playsound sa ti predsa spustí.“ Po ukončení přehrávání zvuků na odkaze chci poté spustit funkci uloženou v proměnné fce. To funguje tak, že addEventListener..ended naposledy spustí play_song, ale protože je již playlist přehrán celý ((cs >= myPlayList.length)) skočí na else {if (fce != null) {window[fce]();}} a spustí funkci uloženou v proměnné fce, není-li null. _es: „fce='loc';window[fce]();“ Tu globální proměnnou fce mám proto, že na některých odkazech nespouštim funkci loc pro přesměrování; ale třeba funkci s alertem atp. nebo ji jen nastavím na fce=null;, pokud to nemá dělat vůbec nic. window[fce]() spustí funkci uloženou do proměnné fce. „A prečo si v kóde vyrábaš taký zmätok, že tam máš funkciu playsound aj funkciu play_sound.“ Protože je to celé vytržené z rozsáhlejšího kódu, kde playsound dělá ještě víc věcí a na základě různých nastavení třeba vůbec nespouští funkci play_song. Někdy přistupuji k play_song přímo, bez playsound, aby se v ní neprováděli skripty. |
||
_es Profil |
#4 · Zasláno: 24. 4. 2013, 13:02:20
regvac:
„Tu globální proměnnou fce mám proto, že“ Globálna premenná sa definuje príkazom var mimo funkcií: Časté potíže, zajímavosti a poučné debaty » Používejte var
„nebo ji jen nastavím na fce=null;, pokud to nemá dělat vůbec nic. window[fce]() spustí funkci uloženou do proměnné fce.“ Ak tam dáš null , tak to vyvolá chybu - výnimku. Ak má funkcia robiť „nič“, má mať hodnotu (function(){}) . Hentaké používanie objektu window je nevhodné.
Metóda addEventListener nefunguje v starších IE. Testovanie dostupnosti prehrávania v tom skripte máš, tak si to už nejako skombinuj na požadovaný výsledok. |
||
regvac Profil * |
#5 · Zasláno: 24. 4. 2013, 13:19:13
_es:
„Globálna premenná sa definuje príkazom var mimo funkcií“ Mám ji takto samozřejmě přes var zavedenou na začátku souboru s javascriptem „Ak tam dáš null“ proto je tam přeci ta podmínka if (fce != null) {window[fce]();} „Metóda addEventListener nefunguje v starších IE.“ no proto to také celé řeším, jak to udělat v prolížečích bez addEventListener nebo bez podpory tagu audio, aby se rovnou spustila funkce uložená v proměnné fce „Testovanie dostupnosti prehrávania v tom skripte máš, tak si to už nejako skombinuj na požadovaný výsledok.“ a s tímto bych právě potřeboval poradit a ne stále odpovídat na něco jiného:-( Původně jsem to celé měl nastavené přes setTimeout();, kdy jsem přednastavil odhadnutou délku trvání nejdelšího audia a pak setTimeout spustila funkci z fce. Krátká audia pak čekala na čas setTimeout. Tak so to pokouším předělat na spuštění funkce fce ihned po přehrání To funguje. Nefunguje ale spuštění fce, pokud k přehrávání z nějakého důvodu vůbec nedojde (např. úplně chybí audio soubor,....) |
||
_es Profil |
regvac:
> „A prečo si v kóde vyrábaš taký zmätok, že tam máš funkciu playsound aj funkciu play_sound.“ > Protože je to celé vytržené z rozsáhlejšího kódu, kde playsound dělá ještě víc věcí a na základě různých nastavení třeba... No veď práve to, že si to do toho rozsiahlejšieho kódu začlenil nejako chaoticky. Keď si poriadne tie funkcie prejdeš, zistíš, že sa v nich testuje dostupnosť možnosti prehrávania, aj aký typ súboru sa dá prehrať. Ty tam však v 34. riadku žiadne testy nemáš. Dostupnosť addEventListener zistíš ľahko - buď tá metóda existuje alebo neexistuje - nájdeš to aj v 2. odkaze v [#4].
|
||
regvac Profil * |
#7 · Zasláno: 25. 4. 2013, 14:22:14
Tak jsem připravil příklad, aby bylo vše zcela jasné, co proč a jak. Viz. dočasná adresa http://4f.webzdarma.cz/zvuky/index.html Je to opět jen výtah z kódu, takprosím neřešte při tom chaotičnost. Děkuji za konkrétní řešení.
|
||
regvac Profil * |
#8 · Zasláno: 26. 4. 2013, 16:06:33
Tak už to mám, stačilo přidat
audioPlayer.addEventListener('error', function () {cs++;play_song();}, false); stejně pozměnit i window.onload = document.getElementById("audioPlayer").addEventListener("ended",function () {cs++;play_song();, false); a z fce play_song odebrat cs++; |
||
Časová prodleva: 11 let
|
0