2012-01-05 23 views
0

我使用HTML5音頻標記來播放音頻文件一個又一個,但我的例行似乎崩潰的Firefox。它只在添加警報()時起作用。重現音頻文件陸續

我有一個PHP程序,檢查每2秒,如果另一個應用程序已派出新事件到服務器,如果是這樣,我在屏幕上書寫新的事件的名稱。其中一些事件具有與它們相關的音頻文件(它們可以是不同的聲音),所以當事件到達時必須播放音頻文件。

我有這個程序:

當事件到達我調用此函數: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); 
     } 
    } 

當audio_player觸發音頻標籤的「結束」事件時,變量「current_sound」被設置爲false。我爲這個事件分配了一個函數,所以每次它被觸發時,它都會將變量current_sound設置爲false。

所有這段代碼的問題是,它僅與警報工作的功能playSound()內。如果我評論它,Firefox會崩潰並開始說js腳本花費很長時間才能完成(其中一個是js腳本,而不是我的腳本)。

我搜索了很多,但我只發現了有關如何重現文件的一個給定的名單,因爲我不知道哪些文件會被事先打不這是不是在我的情況下,」有用的例子。

有什麼建議嗎?

+0

這一問題的整個「音頻」元件(以及HTML5元件)可被提取出來,並且這可以被製成實際的Javascript問題。 – 2012-01-05 16:35:05

回答

1

你有一個微不足道的遞歸調用。 alert只是增加了一個延遲並「斷開」該執行鏈,允許別處的線程在邊緣處獲得一個單詞。據推測,你有其他代碼設置current_soundfalse

而不是試圖這樣「等待」,使用回調函數—無論你在做什麼current_sound = false,而是做.play()的東西。

0

第一個電話後,current_sound將被設置爲true。這將導致每次都會執行else分支,從而再次調用該函數。這導致無盡的遞歸。

+0

@Lightness在軌道賽跑謝謝。我知道我應該在我將current_sound設置爲false的函數(這是結束事件被觸發時的回調函數)內執行playSound()函數內部的操作。但是如果我有5個事件等待他們的聲音發揮會發生什麼?這是我不明白如何判斷下一個聲音的回調函數的部分。 – user1132585 2012-01-05 19:47:54

+0

@ user1132585:'$(「#audio-player」)[0]'是下一個。 – 2012-01-05 21:13:28