我有一个javascript函数,效果很好:
function playMp3(str) {
...
}
另一个脚本:
function playMp3wholepage() {
var dgs=new Array();
dgs[0] = "/abc.mp3";
dgs[1] = "/dac.mp3";
dgs[2] = "/hf.mp3";
....
dgs[28] = "/er23.mp3";
dgs[29] = "/read/34_15.mp3";
for (i=0;i<=29;i++){
ses = dgs[i]
setTimeout("playMp3(ses);", 2000)
}
}
我想按照第二个脚本中给出的顺序播放所有声音。但我无法运行第二个脚本,只播放最后一个声音(dgs [29]),而不是所有声音。
谢谢
答案 0 :(得分:1)
当setTimeout回调执行时,sec
已经是dgs[29]
,您需要创建另一个函数范围来保存该值。
for (var i=0; i<=dgs.length; i++){
(function (i) {
setTimeout(function() {
playMp3(dgs[i]);
}, 2000 * i);
}(i));
}
答案 1 :(得分:0)
我猜测正在发生的事情是你的循环完成得如此之快,以至于所有对playMp3
的调用都是基本上被调用的。但是,对setTimeout
的最后一次调用会设置播放的最后一个声音,这就是你听到的所有声音。
此外,使用长度或数组,并使代码灵活:
for(var i=0; i<dgs.length; i++) {
}
答案 2 :(得分:0)
这是关闭的事情。您可以了解更多here。
function playMp3wholepage() {
var dgs=new Array();
dgs[0] = "/abc.mp3";
dgs[1] = "/dac.mp3";
dgs[2] = "/hf.mp3";
for (i=0;i<dgs.length;i++){
ses = dgs[i];
(function(mp3) {
setTimeout(function() {
playMp3(mp3);
}, 2000);
})(ses);
}
}