sounds["foo"]= new Audio("foo.ogg");
function playSound(id){
var snd = this.sounds[id];
if(snd.currentTime>snd.duration*0.99999){
snd.pause();
snd.currentTime=0;
//snd.seekable.start(); //doesnt work
//snd.load(); does the trick but with the cost re-downloading the clip every single time
snd.play();
}
if(snd.currentTime==0)
snd.play();
}
由于某种原因playSound('foo');第一次可以使用,但之后无法在Chrome上使用(在Firefox上可以正常使用)。添加snd.load()似乎可以解决此问题,但是现在每次播放剪辑时,它都会从服务器下载剪辑,这在我的用例中很多。
编辑:哦,并且snd.currentTime似乎在最后卡住了,所以snd.currentTime = 0不会执行任何操作。
最佳答案
以下脚本在OSX,Chrome版本32.0.1700.102和Firefox 27.0上对我来说效果很好。
如果您不想立即循环文件,则使用脚本绝对是正确的方法。
我无法重现您的问题。我将该方法与链接上的onclick Action 相关联,并使用5s .ogg文件进行测试。单击链接并重新播放音频文件一直对我有用。
我注意到的唯一可能的问题是第二个if子句。如果第一个if匹配,则时间设置为0,然后将播放文件。即使我认为这不太可能,也可能是第二个if也已匹配,并且再次调用了snd.play()。因此,我将在其他情况下使用。
你可以试试看吗?即使我认为它不能解决您的问题:/
<script type="text/javascript">
var sounds = [];
sounds["foo"]= new Audio("foo.ogg");
/* First solution, creating a loop */
function playSoundLoop(id){
var snd = this.sounds[id];
snd.play();
snd.addEventListener('ended', function(){
this.currentTime = 0;
this.play();
}, false);
}
/* Use else if instead of if */
function playSound(id){
var snd = this.sounds[id];
if(snd.currentTime>snd.duration*0.99999){
snd.pause();
snd.currentTime=0;
snd.play();
} else if(snd.currentTime==0) {
snd.play();
}
}
</script>