我正在尝试将音乐添加到我正在使用JS和jQuery编写的虚拟游览应用程序中,到目前为止,我的代码(如下所示)在Chrome,FF,IE9和Opera中运行良好。但是在Safari 5.1.7中,这是Windows机器的最新版本,它只是不起作用......通过我对问题的研究,我知道Safari不会自动播放音乐而且必须启动它手动,但当我点击播放按钮时,没有任何反应。而且,顺便说一句,Safari中的代码检查器显示我的音频标签与音乐源在一起,因此我认为它与DOM没有任何关系。关于我的问题的任何想法?
HTML :
<div id="musicBtns">
<p>Music:</p>
<p id="musicPlayBtn">Play</p>
<p>/</p>
<p id="musicPauseBtn">Pause</p>
</div>
我在JS中的音乐对象:
var Music =
{
musicBtns: $('#musicBtns'),
playBtn: $('#musicPlayBtn'),
pauseBtn: $('#musicPauseBtn'),
isPlaying: false,
init: function()
{
if(!music.includeMusic) // If the client didn't want any music in the tour app, remove the music btns from the DOM
{
this.musicBtns.remove();
}
else // Else, setup the audio element
{
var parent = this;
var audio = $('<audio loop="true">');
if(music.autoplay)
{
audio.attr('autoplay', 'autoplay');
this.isPlaying = true;
this.togglePlayPause();
}
// Add a source elements and appends them to the audio element
this.addSource(audio, music.ogg); // 'music.ogg' is a reference to the path in a JSON file
this.addSource(audio, music.mp3);
this.musicBtns.append(audio);
// Add event listeners for the play/pause btns
this.playBtn.click(function()
{
audio.trigger('play');
parent.isPlaying = true;
parent.togglePlayPause();
});
this.pauseBtn.click(function()
{
audio.trigger('pause');
parent.isPlaying = false;
parent.togglePlayPause();
});
}
},
addSource: function(el, path)
{
el.append($('<source>').attr('src', path));
},
// Add or remove classes depending on the state of play/pause
togglePlayPause: function()
{
if(this.isPlaying)
{
this.playBtn.addClass('underline');
this.pauseBtn.removeClass('underline');
}
else
{
this.playBtn.removeClass('underline');
this.pauseBtn.addClass('underline');
}
}
}
编辑:这可能是Safari中的错误吗?
答案 0 :(得分:1)
所以问题结果与QuickTime有关。我想我必须将它从机器上删除一段时间,因为我认为我不需要它。重新安装QuickTime后,Safari使用音频标签播放音乐没有问题。自动播放甚至也可以。
有点好笑如何支持本机HTML5音频/视频的支持者,不支持没有插件的HTML5音频/视频......
答案 1 :(得分:0)
在Safari上的HTML5视频中我遇到了一个问题,我必须“加载”(我认为,要么启动缓冲区,要么加载整个内容),然后再将其设置为播放。这似乎实际上使一些webkit浏览器中的东西工作。如下所示:
var a = new Audio("file.mp3");
a.load();
a.play();
值得一试