2012-10-10 25 views
5

我正在動態創建音頻文件並更改動態來源。但是,當我更改src並嘗試更改currentTime時,我總是得到一個無效狀態錯誤。你如何去測試它?或者更好地在事件準備好之後觸發事件,然後調用currentTime來更改其音頻位置。HTML5音頻 - 測試無效狀態錯誤(或Dom異常11)

this.doneLoading = function(aTime){ 

    try{ 
     this.mAudioPlayer.currentTime = aTime/1000.0; 
    }catch(err){ 
     console.log(err); 
    } 
    this.mAudioPlayer.play(); 
} 

this.playAtTime = function(aTime) { 
    Debug("play at time audio: " + aTime); 
    Debug("this.mAudioPlayer.currentTime: " + this.mAudioPlayer.currentTime); 

    this.startTime = aTime; 

    if (this.mAudioPlayer.src != this.mAudioSrc) { 
     this.mAudioPlayer = new Audio(); 
     this.mAudioPlayer.src = this.mAudioSrc; 
     this.mAudioPlayer.load(); 
     this.mAudioPlayer.play(); 
     this.mAudioPlayer.addEventListener('canplaythrough', this.doneLoading(aTime), false); 
    } 
    else if ((isChrome() || isMobileSafari()) && aTime == 0) { 
     this.mAudioPlayer.load(); 
     this.mAudioPlayer.currentTime = aTime/1000.0; 
     this.mAudioPlayer.play(); 
     Debug("Reloading audio"); 
    }else{ 

     this.mAudioPlayer.currentTime = aTime/1000.0; 
     this.mAudioPlayer.play(); 
    }  



}; 

回答

17

對於未來後究竟是誰需要一個測試防止這種無效狀態錯誤,你可以試試這個:

if(this.readyState > 0) 
    this.currentTime = aTime; 

似乎爲我反正工作:)

+1

這工作我認爲這應該是公認的答案THX – Prozi

9

你是不是傳遞一個函數參考您的addEventListener - 您所呼叫的函數內聯。所述doneLoading()函數立即執行(該文件已加載之前)和瀏覽器正確地拋出INVALID_STATE_ERR:

this.mAudioPlayer.addEventListener('canplaythrough', this.doneLoading(aTime), false);

嘗試傳遞函數參考代替。就像這樣:

this.mAudioPlayer.addEventListener('loadedmetadata',function(){ 
    this.currentTime = aTime/1000.0; 
}, false); 
+0

謝謝,對我來說這絕對是一個非常糟糕的錯誤。 – Neablis