You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core Razor视图中setInterval()方法无法正常更新倒计时

问题解决:倒计时setInterval不更新的原因及修复

问题根源

你的代码里,setInterval的回调函数每次计算时,用的是第一次AJAX请求返回的服务器时间(data.date是固定值),并没有在每秒执行时重新获取最新的服务器时间,所以distance值永远不变,自然页面显示的倒计时不会更新。

修复方案

方案1:基于客户端本地时间自增(推荐,减少服务器请求)

既然已经拿到初始的服务器时间和目标未来时间的差值,不需要每次请求服务器,直接在客户端每秒把distance减1000毫秒(1秒)即可:

修改后的客户端代码:

var futureTime = new Date("2023-11-13T03:07:35.5381325+03:30").getTime();
$.ajax({
    url: "/Home/CountDown",
    type: "GET",
    dataType: "json",
    success: function (data) {
        // 计算初始时间差
        var countDownDate = new Date(data.date).getTime();
        var distance = futureTime - countDownDate;

        var x = setInterval(function () {
            // 每秒减少1秒的时间差
            distance -= 1000;

            // 时间计算逻辑保持不变
            var days = Math.floor(distance / (1000 * 60 * 60 * 24));
            var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
            var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
            var seconds = Math.floor((distance % (1000 * 60)) / 1000);

            document.getElementById("date").innerHTML = days + "d " + hours + "h "
                + minutes + "m " + seconds + "s ";

            if (distance < 0) {
                clearInterval(x);
                document.getElementById("date").innerHTML = "EXPIRED";
            }
        }, 1000);
    },
});

方案2:每秒重新请求服务器时间(不推荐,频繁请求)

如果必须依赖服务器时间(比如客户端本地时间可能不准),可以把AJAX请求放到setInterval内部,每次获取最新的服务器时间:

var futureTime = new Date("2023-11-13T03:07:35.5381325+03:30").getTime();

var x = setInterval(function () {
    $.ajax({
        url: "/Home/CountDown",
        type: "GET",
        dataType: "json",
        success: function (data) {
            var countDownDate = new Date(data.date).getTime();
            var distance = futureTime - countDownDate;

            var days = Math.floor(distance / (1000 * 60 * 60 * 24));
            var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
            var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
            var seconds = Math.floor((distance % (1000 * 60)) / 1000);

            document.getElementById("date").innerHTML = days + "d " + hours + "h "
                + minutes + "m " + seconds + "s ";

            if (distance < 0) {
                clearInterval(x);
                document.getElementById("date").innerHTML = "EXPIRED";
            }
        },
    });
}, 1000);

注意:这种方式每秒都会发起一次HTTP请求,会增加服务器压力,除非有特殊需求,优先使用方案1。

内容的提问来源于stack exchange,提问作者Hossein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:56:05