JavaScript 倒计时时钟

2023-12-29

 <script>
var interval;
var minutes = 1;
var seconds = 5;
window.onload = function() {
    countdown('countdown');
}

function countdown(element) {
    interval = setInterval(function() {
        var el = document.getElementById(element);
        if(seconds == 0) {
            if(minutes == 0) {
                el.innerHTML = "countdown's over!";                    
                clearInterval(interval);
                return;
            } else {
                minutes--;
                seconds = 60;
            }
        }
        if(minutes > 0) {
            var minute_text = minutes + (minutes > 1 ? ' minutes' : ' minute');
        } else {
            var minute_text = '';
        }
        var second_text = seconds > 1 ? 'seconds' : 'second';
        el.innerHTML = minute_text + ' ' + seconds + ' ' + second_text + ' remaining';
        seconds--;
    }, 1000);
}
</script>

这是一个很好的倒计时时钟,我想在数据列表中显示时间我该怎么做? 就像这个网站 www.1buy1.co.il


我在这里看到的答案效果很好,但并不完全严格。尽管 setInterval() 看起来是正确的函数,但随着时间的推移,它会出现轻微的“漂移”。此外,如果其他一些 JavaScript 函数需要一秒或更长时间才能执行,那么您的倒计时时钟可能会停止并显示错误的时间。

尽管这些情况不太可能发生,但提高精度实际上并不困难。您想要的是一个能够将时钟从不准确的情况中拉回来的计时器。您需要根据系统时钟计算时间,而不是根据时间间隔的频率来计算,为此,您必须放弃 setInterval(),转而使用一系列 setTimeout() 调用。下面的代码展示了如何操作。

function countdown( elementName, minutes, seconds )
{
    var element, endTime, hours, mins, msLeft, time;

    function twoDigits( n )
    {
        return (n <= 9 ? "0" + n : n);
    }

    function updateTimer()
    {
        msLeft = endTime - (+new Date);
        if ( msLeft < 1000 ) {
            element.innerHTML = "countdown's over!";
        } else {
            time = new Date( msLeft );
            hours = time.getUTCHours();
            mins = time.getUTCMinutes();
            element.innerHTML = (hours ? hours + ':' + twoDigits( mins ) : mins) +
                ':' + twoDigits( time.getUTCSeconds() );
            setTimeout( updateTimer, time.getUTCMilliseconds() + 500 );
        }
    }

    element = document.getElementById( elementName );
    endTime = (+new Date) + 1000 * (60*minutes + seconds) + 500;
    updateTimer();
}

Try it: http://jsfiddle.net/mrwilk/qVuHW http://jsfiddle.net/mrwilk/qVuHW

如果您的时钟偶然与系统时钟的秒数非常接近,则您的倒计时器可能会因为在一秒间隔之前或之后接收到超时事件而出现“错过节拍”。解决方案是在半秒内调整您的事件;也就是说,系统时钟的秒拍之间的中间位置。这就是代码中 500 的作用,其中 500 毫秒 = ½ 秒。

唯一值得注意的是,这里的代码显示小时以及分钟和秒;即,HH:MM:SS。从毫秒计算小时、分钟和秒并不困难,但有点尴尬,最简单的方法是让 Date 对象为您完成这项工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 倒计时时钟 的相关文章

随机推荐

  • Excel表格查找两列的匹配值

    我想创建一个匹配两列的表查找公式 例如 假设我想找到的值Letter所在行的列Type列是Biennial和Result列是Warning A B C 1 Letter Type Result 2 A Annual Exceeds 3 B
  • zsh vi 模式状态行

    zsh 或 bash 有没有办法获得状态行 例如在 VI 中 它会让您知道您处于插入模式 插入 是否有等效的命令行 这已经在以下位置得到了回答超级用户 https superuser com questions 151803 how do
  • 流畅的 NHibernate API 和 .NET 2.0

    我可以将 Fluent NHibernate API 用于 NET 2 0 应用程序吗 否 FluentNhibernate 需要 NET 3 5
  • 确定文件身份的算法

    对于一个开源项目 我正在文件系统之上编写一个抽象层 该层允许我将元数据和关系附加到每个文件 我希望该层能够优雅地处理文件重命名 并在文件被重命名 移动或复制时维护元数据 为此 我需要一种计算文件身份的机制 显而易见的解决方案是计算每个文件的
  • WKWebView 的 WKSelectionGranularityCharacter 选项在 iOS 9 中损坏

    我有一个 iPad 应用程序 使用WKSelectionGranularityCharacter的选项WKWebView 它在 iOS 8 设备上运行良好 在 8 4 模拟器上运行 但在 9 1 上损坏 长按文本会显示放大镜 但松开后不会突
  • Visual Studio 2017 构建工具仍然可供下载吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 Visual Studio 2017 构建工具 它们在某处还可用吗 我可以找到2015 ht
  • 在 ASP.NET Core 中将 html 导出为 pdf

    我想将一段 html 导出到 pdf 文件 但我没有任何兼容的 nuget 包 当我尝试安装任何人时 X 与 netcoreapp1 0 NETCoreApp 版本 v1 0 不兼容 有谁知道使用 ASP NET Core 导出为 pdf
  • 将 PHP 变量传递给 Google Maps API

    当用户注册我的应用程序 大学项目 时 系统会要求他们提供地址 我将此地址转换为纬度和经度 然后将其存储在我的数据库中 我像这样访问纬度和经度
  • CoAP 观察者过多

    我想 观察 CoAP 服务器中的资源 但我注意到 在我注册观察服务器中的一些资源后 我尝试 观察 的其他资源会抛出一条消息 提示 观察者太多 我正在使用 Copper Firefox 连接到服务器 CoAP 服务器可以观察到的资源是否有限制
  • Rails:在连接上使用 .references,即使这不是必需的

    我知道当你使用includes并且您指定一个where连接表上的子句 您应该使用 references example will error out or throw deprecation warning in logs customer
  • 为什么局部变量的常量性会抑制返回值的移动语义?

    struct STest public boost noncopyable STest STest test m n std move test m n explicit STest int n m n n int m n STest Fu
  • 如何在单个查询中获取最大值和最小值?

    我正在使用 MySQL 并且正在寻找一种从两列 例如 posx and posy 仅使用一个查询 Simple SELECT MIN posx MIN posy MAX posx MAX posy FROM table
  • 构建 Clang 时未知的软件包 libcxx 和 libcxxabi?

    我正在尝试使用 libc 从源代码构建 Clang 我试图将 libc 放入树内 同时使用其他组件在树外构建它 我使用的食谱如下 如果我简单地放置libcxx and libcxxabiin tree 然后配置does not拿起它们 它们
  • Homebrew:无法链接Python

    我在 Homebrew 中链接 python 时遇到问题 这是输出 brew link python 链接 usr local Cellar python 2 7 13 错误 权限被拒绝 usr local Frameworks When
  • 使用三个 js 更改合并网格上的材质颜色

    是否可以与合并多个网格时使用的缓冲区进行交互以更改所选单个网格上的颜色 使用网格集合很容易做到这一点 但是具有多种不同材质的合并网格又如何呢 hgates 你最后的评论对我非常有帮助 我几天来一直在寻找同样的东西 好的 我在每个面上设置了一
  • 根据高度调整 Div 大小但保留纵横比(几乎明白了)奇怪的重新加载错误

    根据父 div 的宽度调整视频大小时 有很多保持宽高比的解决方案 其中大多数依赖于 padding top 和 padding bottom 是根据宽度而不是高度计算的事实 我正在尝试做类似的事情 但我想根据父 div 的高度调整视频大小
  • SVN 预提交挂钩以限制文件扩展名被提交

    在 Collabnet SVN 的预提交脚本中使用以下代码来限制特定文件扩展名的提交 但它会提交所有文件 你能告诉我哪里错了吗 bin sh REPOS 1 TXN 2 SVNLOOK home csvn csvn bin svnlook
  • 在 WooCommerce 中确认付款后添加自定义元数据

    我在网上寻找一种解决方案来添加我正在使用的支付网关的响应 我想添加我得到的验证码和更多数据 付款完成后我需要添加此内容 Payment complete order gt payment complete payment id 我确实尝试过
  • 使用 GLM lambda 搜索进行交叉验证时需要注意什么?

    关于h2o glm lambda 搜索似乎没有迭代所有 lambda https stackoverflow com q 45890985 841830 我读到这个问题是在抱怨 lambda 太高了 他们尝试设置early stopping
  • JavaScript 倒计时时钟