如何在 JavaScript 中延迟此代码 运行?
How do I delay this code running in JavaScript?
我写了这段代码来改变图像:
change = function(){
for (r=0; r<6; r++){
for (i = 0; i < 6 ; i++) {
setInterval(imgfile(number=i+1), 5000);
}
}
}
imgfile= function(number){
a = 'document.getElementById("imgdiv").src = "images/'+number+'.svg"';
eval(a);
}
单击按钮时调用函数 change()
。
当我按下按钮时,图像直接变为 6.svg,当我希望它遍历图像 1、2、3、4、5、6 并重复 6 次时。当我将 setInterval
更改为 change.setInterval
或 imgfile.setInterval
时,它根本不起作用。我该如何解决这个问题?
您想setTimeout()
.
setTimeout
暂停毫秒值,然后执行代码。 setInterval
每毫秒运行一次代码。
是的,不要做 change.setInterval
或其他什么,它只是 setInterval
。
你的一个例子是在 for 循环中替换 setInterval
函数。
setTimeout(imgfile(i+1), 5000);
change = function(i=0){
imgfile(i%6+1);//change image
if(i<36) setTimeout(change,5000,i+1);//next image in 5 seconds
}
imgfile= function(number){
document.getElementById("imgdiv").src = "images/"+number+".svg";//no need to use ev(i||a)l
}
而不是 loop/interval 混乱,你可以简单地启动一个超时,在更改图像后重新启动它自己......这段代码将循环播放 6 张图像,延迟 5 秒,然后循环 6 次......
对于另一个问题,我写了一个很好的实用函数,它有很多用途,但也可以很容易地处理这种情况。主要问题是设置的不同延迟之间没有时间流逝。因此,您将 6 个不同的操作设置为在 5000 毫秒内全部发生,并且所有操作都将在同一时刻发生。
这是我的
这是该答案的效用函数,以及它在您的问题中的应用。
function doHeavyTask(params) {
var totalMillisAllotted = params.totalMillisAllotted;
var totalTasks = params.totalTasks;
var tasksPerTick = params.tasksPerTick;
var tasksCompleted = 0;
var totalTicks = Math.ceil(totalTasks / tasksPerTick);
var initialDelay = params.initialDelay;
var interval = null;
if (totalTicks === 0) return;
var doTick = function() {
var totalByEndOfTick = Math.min(tasksCompleted + tasksPerTick, totalTasks);
do {
params.task(tasksCompleted++);
} while(tasksCompleted < totalByEndOfTick);
if (tasksCompleted >= totalTasks) clearInterval(interval);
};
// Tick once immediately, and then as many times as needed using setInterval
if (!initialDelay) doTick();
if (tasksCompleted < totalTicks) interval = setInterval(doTick, totalMillisAllotted / totalTicks);
}
// Do 6 actions over the course of 5000 x 6 milliseconds
doHeavyTask({
totalMillisAllotted: 5000 * 6,
totalTasks: 6,
tasksPerTick: 1,
initialDelay: false, // Controls if the 1st tick should occur immediately
task: function(n) { console.log('Set image to "images/' + (n + 1) + '.svg"'); }
});
也许是这样的?
var index, imgCount, loopCount, imgTag, countdown;
index = 0;
imgCount = 6;
loopCount = 6;
imgTag = document.getElementById('imgdiv');
countdown = function () {
if (index < imgCount * loopCount) {
imgTag.src = 'images/' + index % imgCount + '.svg';
index = index + 1;
setTimeout(countdown, 5000);
}
};
countdown();
这里我们避免了双循环并使用模块化数学(索引 % imgCount)来获得正确的文件编号。
我写了这段代码来改变图像:
change = function(){
for (r=0; r<6; r++){
for (i = 0; i < 6 ; i++) {
setInterval(imgfile(number=i+1), 5000);
}
}
}
imgfile= function(number){
a = 'document.getElementById("imgdiv").src = "images/'+number+'.svg"';
eval(a);
}
单击按钮时调用函数 change()
。
当我按下按钮时,图像直接变为 6.svg,当我希望它遍历图像 1、2、3、4、5、6 并重复 6 次时。当我将 setInterval
更改为 change.setInterval
或 imgfile.setInterval
时,它根本不起作用。我该如何解决这个问题?
您想setTimeout()
.
setTimeout
暂停毫秒值,然后执行代码。 setInterval
每毫秒运行一次代码。
是的,不要做 change.setInterval
或其他什么,它只是 setInterval
。
你的一个例子是在 for 循环中替换 setInterval
函数。
setTimeout(imgfile(i+1), 5000);
change = function(i=0){
imgfile(i%6+1);//change image
if(i<36) setTimeout(change,5000,i+1);//next image in 5 seconds
}
imgfile= function(number){
document.getElementById("imgdiv").src = "images/"+number+".svg";//no need to use ev(i||a)l
}
而不是 loop/interval 混乱,你可以简单地启动一个超时,在更改图像后重新启动它自己......这段代码将循环播放 6 张图像,延迟 5 秒,然后循环 6 次......
对于另一个问题,我写了一个很好的实用函数,它有很多用途,但也可以很容易地处理这种情况。主要问题是设置的不同延迟之间没有时间流逝。因此,您将 6 个不同的操作设置为在 5000 毫秒内全部发生,并且所有操作都将在同一时刻发生。
这是我的
这是该答案的效用函数,以及它在您的问题中的应用。
function doHeavyTask(params) {
var totalMillisAllotted = params.totalMillisAllotted;
var totalTasks = params.totalTasks;
var tasksPerTick = params.tasksPerTick;
var tasksCompleted = 0;
var totalTicks = Math.ceil(totalTasks / tasksPerTick);
var initialDelay = params.initialDelay;
var interval = null;
if (totalTicks === 0) return;
var doTick = function() {
var totalByEndOfTick = Math.min(tasksCompleted + tasksPerTick, totalTasks);
do {
params.task(tasksCompleted++);
} while(tasksCompleted < totalByEndOfTick);
if (tasksCompleted >= totalTasks) clearInterval(interval);
};
// Tick once immediately, and then as many times as needed using setInterval
if (!initialDelay) doTick();
if (tasksCompleted < totalTicks) interval = setInterval(doTick, totalMillisAllotted / totalTicks);
}
// Do 6 actions over the course of 5000 x 6 milliseconds
doHeavyTask({
totalMillisAllotted: 5000 * 6,
totalTasks: 6,
tasksPerTick: 1,
initialDelay: false, // Controls if the 1st tick should occur immediately
task: function(n) { console.log('Set image to "images/' + (n + 1) + '.svg"'); }
});
也许是这样的?
var index, imgCount, loopCount, imgTag, countdown;
index = 0;
imgCount = 6;
loopCount = 6;
imgTag = document.getElementById('imgdiv');
countdown = function () {
if (index < imgCount * loopCount) {
imgTag.src = 'images/' + index % imgCount + '.svg';
index = index + 1;
setTimeout(countdown, 5000);
}
};
countdown();
这里我们避免了双循环并使用模块化数学(索引 % imgCount)来获得正确的文件编号。