2012-10-10 33 views
5

Dinamik olarak bir ses dosyası oluşturuyorum ve kaynağı anında değiştiriyorum. Ancak src'yi değiştirip currentTime'ı değiştirdikten sonra her zaman Geçersiz durum hatası alıyorum. Bunu test etmek için nasıl gidiyorsunuz? Ya da daha iyi bir olay olduğunda, daha sonra bir olay tetiklenir ve daha sonra currentTime'ın ses konumunu değiştirmesi çağrılır.HTML5 ses - Geçersiz Durum Hatası (Veya Dom Özel Durum 11) için sınama

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(); 
    }  



}; 

cevap

17

kim aslında bu geçersiz durum hatasını önlemek için bir testi gerekiyorsa, bu deneyebilirsiniz:

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

neyse benim için çalışmak görünüyor :)

+1

BU ÇALIŞMALAR Bu kabul edilen cevap THX olmalı bence – Prozi

9

Sen addEventListener bir fonksiyonu referansı iletmediğinizi - fonksiyon satır içi çağırıyor. doneLoading() fonksiyonu (dosya yüklendiğinde önce) hemen yürütür ve tarayıcı doğru bir INVALID_STATE_ERR atar:

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

yerine işlev referans geçen deneyin. Şunun gibi: sonra gelenler için

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

Teşekkür ederim, Bu kesinlikle gözden kaçırmamak için çok kötü bir hatadır. – Neablis