2012-04-19 77 views
2

我正在嘗試編寫自己的HTML5音頻播放器:您可以偷看它hereHTML5音頻Safari發行

它工作正常,在IE9中,FF,Chrome,但在Safari中由於某種原因,即使我已經聽了

audio.addEventListener("loadedmetadata", tryThis, false); 

它顯示的NaN 時間數據只是在玩之前。

audio.setAttribute("src", a[trackNo][1]); 
audio.load(); 
audio.addEventListener("loadedmetadata", tryThis, false); 

function tryThis() 
{ 
    this.addEventListener("timeupdate", function() { document.getElementById(radioPointer.toString()).innerHTML = formatTime(this.duration, this.currentTime);}, false); 

    this.addEventListener("ended", function() { document.getElementById(radioPointer.toString()).innerHTML = formatTime(this.duration, 0); document.rootsPlaylist.roots[radioPointer].checked = false; }, false); 

    this.play();  
} 

<audio id="rootsPlayer" style="display:none;"></audio> 

可以爲您提供什麼幫助嗎?

非常感謝。

注意:你必須經常翻看歌曲才能看到我的意思,對不起,我忘了提及這一點。

+0

快速修復此,我用是檢查isNaN(): https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/isNaN 然後將持續時間設置爲00:00或其他默認值(如果其爲真) – bcmoney 2012-04-19 18:09:34

+0

是的,我已經嘗試過,但這不是我要用的樣式。感謝你的分享。 – iTEgg 2012-04-19 18:12:01

+0

再次感謝您的意見,仔細想想,爲了保持簡單,我採用了isNan()! – iTEgg 2012-04-19 19:03:21

回答

0

原因是duration屬性僅在發出durationchange事件後才初始化。所以,你既可以使用isNan()功能或者一些虛擬durationInitialized變量:

var durationInitialized = 0; 
audio.setAttribute("src", a[trackNo][1]); 
audio.load(); 
audio.addEventListener("loadedmetadata", tryThis, false); 
audio.addEventListener("durationchange", function() {durationInitialized = 1;}, false); 
function tryThis() { 
this.addEventListener("timeupdate", function() { 
    var time = ''; 
    if (durationInitialized) time = formatTime(this.duration, this.currentTime); 
    else time = formatTime(this.currentTime); 
    document.getElementById(radioPointer.toString()).innerHTML = time; 
}, false); 

this.addEventListener("ended", function() { 
    var time = ''; 
    if (durationInitialized) time = formatTime(this.duration, 0); 
    else time = formatTime(0); 
    document.getElementById(radioPointer.toString()).innerHTML = time; 
    document.rootsPlaylist.roots[radioPointer].checked = false; 
}, false); 

this.play();  
}