2012-04-19 3 views
2

Я пытаюсь написать свой собственный аудиоплеер HTML5: вы можете заглянуть в него here.HTML5 Audio Safari Issue

Это прекрасно работает в 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

+0

Да, я уже пробовал это, но это не тот стиль, который я собираюсь сделать. Спасибо, что поделились. – iTEgg

+0

Спасибо за вход снова, подумал об этом и, чтобы сохранить его простым, я принял isNan()! – iTEgg

ответ

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