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

网站重构后CountUp计时组件停止运行,寻求技术解决方案

问题修复方案

核心问题分析

  1. HTML重复ID:计时代码容器<div>同时设置了id="three"和id="countup1",HTML规范禁止单个元素拥有多个ID,浏览器只会识别第一个ID,导致JS无法找到目标元素。
  2. JS日期计算逻辑错误:先将传入的日期转为时间戳,随后又用该时间戳重新创建Date对象,导致时间差计算异常。
  3. 未声明变量:days、hours、mins、secs未用var/let声明,会成为全局变量,存在潜在冲突风险。
  4. 标签不匹配:<h3 id="two"><b>Let's see!</b></h2>中<h3>用<h2>闭合,可能破坏DOM结构。

修复后的代码

HTML代码

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
<link href="styles2.css" rel="stylesheet">
<link href="transitions.css" rel="stylesheet">
<link href="fade.css" rel="stylesheet">
<meta http-equiv="refresh" content="35; url = gallery.html" />


<div class="h-100 d-flex align-items-center justify-content-center">
<div>
<h3 id="one">So... How long has it been?</h3>
<br>
<h3 id="two"><b>Let's see!</b></h3>
<br><br>

<h3>
<!-- 移除重复ID,保留countup1作为唯一标识 -->
<div class="countup" id="countup1">
<span class="sep">
<span class="timeel days">00</span>
<br>
<span class="timeel timeRefDays">days</span>
</span>
<span class="sep">
<span class="timeel hours">00</span>
<br>
<span class="timeel timeRefHours">hours</span>
</span>
<span class="sep">
<span class="timeel minutes">00</span>
<br>
<span class="timeel timeRefMinutes">minutes</span>
</span>
<span class="sep">
<span class="timeel seconds">00</span>
<br>
<span class="timeel timeRefSeconds">seconds</span>
</span>
</div>
</h3>

</div>
</div>
<!-- 将script标签移到body末尾,确保DOM加载完成后执行 -->
<script type="text/javascript" src="time.js"></script>

JS代码

window.addEventListener('load', (event) => {
    console.log('The page has fully loaded');
    countUpFromTime("July 9, 2021 12:00:00", 'countup1');
});

function countUpFromTime(countFrom, id) {
    // 直接将传入日期转为时间戳,避免重复转换错误
    const countFromTimestamp = new Date(countFrom).getTime();
    const now = new Date().getTime();
    const timeDifference = now - countFromTimestamp;

    const secondsInADay = 60 * 60 * 1000 * 24;
    const secondsInAHour = 60 * 60 * 1000;
    // 用let声明变量,避免全局污染
    let days = Math.floor(timeDifference / secondsInADay);
    let hours = Math.floor((timeDifference % secondsInADay) / secondsInAHour);
    let mins = Math.floor(((timeDifference % secondsInADay) % secondsInAHour) / (60 * 1000));
    let secs = Math.floor((((timeDifference % secondsInADay) % secondsInAHour) % (60 * 1000)) / 1000);

    const idEl = document.getElementById(id);
    // 增加元素存在性判断,避免报错
    if (idEl) {
        idEl.getElementsByClassName('days')[0].textContent = days;
        idEl.getElementsByClassName('hours')[0].textContent = hours;
        idEl.getElementsByClassName('minutes')[0].textContent = mins;
        idEl.getElementsByClassName('seconds')[0].textContent = secs;
    }

    clearTimeout(countUpFromTime.interval);
    countUpFromTime.interval = setTimeout(() => countUpFromTime(countFrom, id), 1000);
};

额外优化建议

  • 用textContent替代innerHTML更新文本,更安全且性能更优
  • 增加元素存在性判断,避免因DOM加载异常导致控制台报错
  • 将script标签移到body末尾,无需依赖window.onload也能确保DOM加载完成

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:37:45