我创建了一个倒计时功能,但它只是在开始时起作用然后停止。
var rek_inter = setInterval(cnt(s_, d), 1000);
function cnt(deg, deg2) {
deg--;
while (deg < 0) {
deg = 59;
deg2--;
}
if (deg2 < 0) {
$('#s_').html("ok");
} else if (deg2 >= 0) {
var d_sn = fixd(deg2);
var s_sn = fixd(deg);
$('#s_').html(d_sn + ":" + s_sn);
}
}
function fixd(g) {
if (g < 10) {
return '0' + g;
}
return g;
}
我也试过了;
var rek_inter = setInterval(function() {cnt(s_, d);}, 1000);
但结果是一样的。
如果我将函数放入区间函数中:
var rek_inter = setInterval(function () {
s_--;
while (s_ < 0) {
s_ = 59;
d--;
}
if (d < 0) {
$('#s_').html("ok");
} else if (d >= 0) {
var d_sn = fixd(d);
var s_sn = fixd(s_);
$('#s_').html(d_sn + ":" + s_sn);
}
}, 1000);
function fixd(g) {
if (g < 10) {
return '0' + g;
}
return g;
}
有效。但是我需要这样,因为我首先在顶部写道。这可能是什么问题和解决方案?
答案 0 :(得分:2)
第一次尝试与:
相同setInterval ( value, time) ;
这里是value = cnt(s_, d)
,是cnt函数调用的结果
这不起作用,因为setInterval需要一个函数。太糟糕了,它在javascript中无声地失败。
在第二次尝试中,问题是你只修改了函数var,所以不会发生任何变化:你改变了deg,deg2,实际上你想改变s_和d。
第三次尝试是正确的,因为你们都调用了一个函数并改变了全局变量s_和d。 我宁愿这样写:
var rek_inter = setInterval( iterate , 1000);
function iterate () {
s_--;
while (s_ < 0) {
s_ = 59;
d--;
}
if (d < 0) {
$('#s_').html("ok");
} else if (d >= 0) {
var d_sn = fixd(d);
var s_sn = fixd(s_);
$('#s_').html(d_sn + ":" + s_sn);
}
}
编辑: O.P.提到他想要处理一组(s_,d)参数 我建议你创建一个包含这些参数的对象数组:
var sdParameters = [];
sdParameters.push( { s : some value , d: some other value} );
sdParameters.push( { s : some value 2, d: some other value 2 } );
... // (or using a for loop to grab the ds and ss if possible)
然后在每个s / d对象由其索引定义之后,使用:
function iterate (ind) {
var s_ = --sdParameters[ind].s ;
while (s_ < 0) {
s_ = 59;
sdParameters[ind].d--;
}
var d = sdParameters[ind].d;
if (d < 0) {
$('#s_').html("ok");
} else if (d >= 0) {
var d_sn = fixd(d);
var s_sn = fixd(s_);
$('#s_').html(d_sn + ":" + s_sn);
}
}
您可以在一个全局数组上运行所有间隔:
var rek_inter = setInterval( iterate.bind(null,0) , 1000);
var rek_inter1 = setInterval( iterate.bind(null,1) , 1000);
(显然你可以/应该将间隔存储在一个数组中,你可以将它们存储在sdParameters中。
最后一句话:我无法使用相关的变量名称,因为我无法猜测其用途。当事情变得更复杂时,在代码中使用重要名称会有很大帮助。
答案 1 :(得分:2)
“我有很多s_,s_2,s_3 ......和d,d1,d2 ......值,我想在单个setInterval中使用它们,这就是我尝试使用cnt(s_,d)的原因);如果那样可行,我会写cnt(s_2,d2),cnt(s_3,d3)..“
你可以在这里使用闭包。
var rek_inter1 = setInterval(cnt(s_2, d2), 1000),
rek_inter2 = setInterval(cnt(s_3, d3), 1000);
function cnt(deg, deg2) {
return function () {
deg--;
while (deg < 0) {
deg = 59;
deg2--;
}
if (deg2 < 0) {
$('#s_').html("ok");
} else if (deg2 >= 0) {
var d_sn = fixd(deg2);
var s_sn = fixd(deg);
$('#s_').html(d_sn + ":" + s_sn);
}
};
}