我试图将前导零添加到秒值,并且我一直遇到错误。我已尝试在此处发布了一些选定的解决方案,似乎无法使其正常运行。
我从跨度中提取值,因为这些值来自数据库。
var timer = $('.timer');
$('.prev-button,.next-button').hide();
setInterval(function () {
var m = $('.min', timer),
s = $('.sec', timer);
if (m.length == 0 && parseInt(s.html()) <= 0) {
timer.html('Proceed to the Next Slide');
$('.prev-button,.next-button').fadeIn();
}
if (parseInt(s.html()) <= 0) {
m.html(parseInt(m.html() - 1));
s.html(60);
}
if (parseInt(s.html()) < 10) {
$('.sec').prepend(0)
}
if (parseInt(m.html()) <= 0) {
timer.html('Time remaining for this slide - <span class="sec">59</span> seconds')
}
s.html(parseInt(s.html() -1));
}, 1000);
答案 0 :(得分:1)
我修改了你的小提琴以使其有效。 http://jsfiddle.net/a2uJ2/3/
您应该将时间存储在javascript int vars中,而不是每次都从html元素中读取它。当您将逻辑附加到html文档的布局时,这会导致可维护性问题。
我没有修复所有代码,但我创建了两个用于执行计算的变量。
答案 1 :(得分:1)
一些事情:你最好注册一个开始时间,然后在区间函数中进行比较。定时器不能保证精确,但会在或指定的时间间隔后触发。如果电脑忙,计时器可能会迟到。
此外,如果您正在使用parseInt
,则始终总是指定基数参数(数字基数)。如果不这样做,字符串“08”将被解析为“0”,因为前导零被解释为八进制(base-8)。因此,使用parseInt(string, 10)
来解析普通的10号基数。
至于添加前导零,我会说你应该保留几个变量的总时间,而不是一直读/写元素。
var duration, startTime, interval;
duration = parseInt($(".min").text(), 10) * 60 + parseInt($(".sec").text(), 10);
startTime = (new Date()).getTime();
function countDown() {
var elapsed, remaining, m, s;
elapsed = ((new Date()).getTime() - startTime) / 1000;
remaining = duration - elapsed;
if(remaining <= 0) {
clearInterval(interval);
$(".timer").text('Proceed to the Next Slide');
$('.prev-button,.next-button').fadeIn();
} else {
m = String(Math.round(remaining / 60));
s = String(Math.round(remaining % 60));
if( s < 10 ) {
s = "0" + s;
}
$(".min").text(m);
$(".sec").text(s);
}
}
interval = setInterval(countDown, 500);
这只是您代码的最小变化。我可能会做一些根本不同的事情,以保持标记和JS尽可能分开,依此类推,但这也有效。
答案 2 :(得分:0)
尝试这样:
if (parseInt(s.html()) < 10) {
$('.sec').val('0' + $('.sec').val());
}
答案 3 :(得分:0)
您需要将该值视为string
,而不是int
。 JavaScript非常积极地将看起来像数字的东西转换成数字,这就是这里发生的事情。