2012-01-05 8 views
0

私はHTML5オーディオタグを使用してオーディオファイルを再生していますが、私のルーチンはFirefoxをクラッシュさせるようです。アラートを追加すると機能します()。オーディオファイルを1つずつ再生する

私は、別のアプリケーションがサーバーに新しいイベントを送信した場合に2秒ごとにチェックするルーチンをPHPで作成しています。新しいイベントの名前を画面に書きます。これらのイベントの中には、それらに関連するオーディオファイルがあります(異なるサウンドになる可能性があります)。イベントが到着すると、オーディオファイルを再生する必要があります。

私はこのルーチンを持っている:

イベントが、私はこの関数を呼び出す到着すると:playSound(sound_name)。

function playSound(sound_name){ 
     if (!current_sound){ 
      current_sound = true; 
      $("#audio-player")[0].src = "../snd/"+sound_name; 
      //$("#audio-player")[0].load(); 
      $("#audio-player")[0].play(); 
     } 
     else { 
      //alert(sound_name); 
      playSound(sound_name); 
     } 
    } 

変数 "current_sound"は、audio_playerがオーディオタグの "ended"イベントを発生させるとfalseに設定されます。私はこのイベントに関数をアタッチしました。それが発生するたびに、変数current_soundをfalseに設定します。

このコードの問題は、playSound()関数内のそのアラートでのみ機能することです。私がコメントすると、Firefoxがクラッシュし、jsスクリプトが完了するのに時間がかかりすぎていると言うことが始まります(私のものではなく、jsスクリプトの1つです)。

私は多くを検索しましたが、どのファイルを事前に再生するのかわからないため、私の場合には役に立たないファイルのリストをどのように再現するのかの例が見つかりました。

提案がありますか?

+0

この質問の全「audio」要素(およびHTML5要素)を抽出して、これを実際のJavascript質問にすることができます。 –

答えて

1

些細な再帰呼び出しがあります。 alertは単に遅延を追加し、実行チェーンを「中断」し、スレッドがエッジウェイで単語を取得できるようにします。おそらく、別の場所にコードcurrent_soundfalseを設定しているとします。

このように「待機」しようとする代わりに、current_sound = falseを実行しているときはいつでもコールバック関数—を使用して、代わりに.play()の処理を行います。

0

最初の呼び出し後、current_soundがtrueに設定されます。これにより、毎回elseブランチが作成され、関数が再び呼び出されます。この結果、無限の再帰が発生します。

+0

軌道の@ Lightness Racesありがとう。私はcurrentSoundをfalseに設定している関数内でplaySound()関数内で何をすべきか理解しています。これは "終了"イベントが発生したときのコールバック関数です。しかし、サウンドが再生されるのを待っている5つのイベントがあるとどうなりますか?それは私が次に聞くコールバック関数をどのように伝えるか理解していない部分です。 – user1132585

+0

@ user1132585: '$("#audio-player ")[0]'は次です。 –

関連する問題