用 JavaScript 构建倒计时时钟

Posted

技术标签:

【中文标题】用 JavaScript 构建倒计时时钟【英文标题】:Building a countdown clock in JavaScript 【发布时间】:2011-10-18 20:02:05 【问题描述】:

我正在用 javascript 构建一个倒计时时钟,但无法完全按照我想要的方式格式化它。基本上,我有一个名为 totalTime 的变量,它最初设置为倒计时运行的总秒数。每一秒,这个数字减1,我把它转换成分秒显示在页面上。

让我感到困惑的是,我想在剩余分钟数上包含前导 0,但前提是 totalTime 的 initial 值为 600 (10:00) 或更大。所以,如果我将 totalTime 设置为 600,我希望倒计时显示 10:00、09:59、09:58 等(注意前导 0);但如果我将 totalTime 设置为 300,我希望倒计时显示 5:00、4:59、4:58 等。

换句话说,前导 0 应该根据倒计时开始的时间量(totalTime 的初始值)出现,不是当前还剩下多少时间(当前值总时间)。我该怎么做?

编辑:这是我目前拥有的代码:http://jsfiddle.net/JFYaq/

// Get the countdown element
var countdown = document.getElementById("countdown");

// Set the total time in seconds
var totalTime = 600;

// Every second...
var interval = setInterval(function()
    // Update the time remaining
    updateTime();

    // If time runs out, stop the countdown
    if(totalTime == -1)
        clearInterval(interval);
        return;
    
, 1000);

// Display the countdown
function displayTime()
    // Determine the number of minutes and seconds remaining
    var minutes = Math.floor(totalTime / 60);
    var seconds = totalTime % 60;

    // Add a leading 0 to the number of seconds remaining if it's less than 10
    if (seconds < 10)
        seconds = "0" + seconds;
    

    // Split the number of minutes into two strings
    var minutesString = minutes + "";
    var minutesChunks = minutesString.split("");

    // Split the number of seconds into two strings
    var secondsString = seconds + "";
    var secondsChunks = secondsString.split("");

    // If the total time is 10 minutes or greater...
    if (totalTime >= 600)
        // Add a leading 0 to the number of minutes remaining if it's less than 10
        if (minutes < 10)
            minutes = "0" + minutes;
        
        // Display the time remaining
        countdown.innerhtml = "<span>" + minutesChunks[0] + "</span>" + "<span>" + minutesChunks[1] + "</span>" + ":" + "<span>" + secondsChunks[0] + "</span>" + "<span>" + secondsChunks[1] + "</span>";
    
    // If the total time is less than 10 minutes...
    else 
        // Display the time remaining without a leading 0 on the number of minutes
        countdown.innerHTML = "<span>" + minutes + "</span>" + ":" + "<span>" + secondsChunks[0] + "</span>" + "<span>" + secondsChunks[1] + "</span>"
            


// Update the time remaining
function updateTime()
    displayTime();
    totalTime--;


// Start the countdown immediately on the initial pageload
updateTime();

【问题讨论】:

你能把你写的代码贴出来吗? 更新了指向 JSFiddle 的链接(由于某种原因,我无法在帖子中正确格式化代码)。 【参考方案1】:

小提琴:http://jsfiddle.net/JFYaq/1/

解释:

必要时添加零前缀,可以使用以下函数:

function pad(n)
    return n > 9 ? "" + n : "0" + n;

注意"" + npad(n) 函数将始终返回一个字符串,这对于应用字符串方法很有用。

应始终在第二个计数器处使用填充。对于分钟计数器,将原始时间存储在一个变量中,并检查它是否超过600:

var original = 600;
function padMinute(n)
    return original >= 600 && n < 9 ? "0" + n : "" + n;


与您的代码相关:
function displayTime()
    var minutes = Math.floor(totalTime / 60);
    var seconds = totalTime % 60;

    minutes = "<span>" + padMinute(minutes).split("").join("</span><span>") + "</span>";
    seconds = "<span>" + pad(seconds).split("").join("</span><span>") + "</span>";

    countdown.innerHTML = minutes + ":" + seconds;

.split("") 将字符串拆分为字符列表。 .join("&lt;/span&gt;&lt;span&gt;") 用于连接字符串集,在每个字符之间添加&lt;/span&gt;&lt;span&gt;。整个结果与&lt;span&gt;&lt;/span&gt; 结合在一起,这样最终的HTML 才有效。

执行模型:

1. padMinute(minutes)                       "09"
2.             .split("")                   Array( "0" , "9" )
3.                   .join("</span><span>")
                                            "0</span><span>9"
4.                "<span>" + .. + "</span>" "<span>0</span><span>9<span>"

【讨论】:

太棒了!非常感谢。 在您的代码中,当您说var original = totalTime; 时,original 的值为什么不像 totalTime 那样每秒减少 1?我很好奇为什么会这样。 在 JavaScript 中,原始值(字符串、数字、布尔值、nullundefiend)在另一个变量指向保存它的变量时被复制。所有其他对象都通过引用传递。所以,var a=b:2, c=a; a.b=5; alert(c.b) 将显示5

以上是关于用 JavaScript 构建倒计时时钟的主要内容,如果未能解决你的问题,请参考以下文章

初学JavaScript之利用计时器做出的简单时钟

怎样用JAVA写一个10钟倒计时程序?

有秒计时的数字时钟(MOOC面向对象程序设计--Java语言)

Flash Canvas HTML5 Javascript 中的倒数时钟计时器

有秒计时的数字时钟(Java语言)

中国MOOC_面向对象程序设计——Java语言_第2周 对象交互_1有秒计时的数字时钟