Autor Zpráva
regvac
Profil *
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>
Snad jsem sem nezapomněl něco překopírovat.
_es
Profil
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 *
_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
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 *
_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 *
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 *
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++;

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: