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

JavaScript倒计时定时器每秒重复创建问题修复求助

JavaScript倒计时定时器重复生成组件的修复方案

问题分析

你的代码核心问题是每秒在setInterval里重新创建并插入完整的倒计时DOM结构,导致页面每秒新增一个倒计时组件。如果直接把HTML移出定时器,因为初始渲染的数值不会被后续更新,所以定时器失效。

修复思路

  • 提前在定时器外部创建好倒计时的DOM容器和各个数值元素,保存它们的引用
  • setInterval内部只做两件事:计算最新的倒计时数值、更新对应元素的文本内容
  • 增加倒计时结束的判断,清除定时器并提示状态

修改后的完整代码

// Set the date we're counting down to
var countDownDate = new Date("Jan 5, 2023 15:37:25").getTime();

function makeMeTwoDigits(n){
    return (n < 10 ? "0" : "") + n;
}

// --- 关键改动:提前创建DOM结构,保存元素引用 ---
// 创建主容器
const countdownMain = document.createElement('div');
countdownMain.className = 'countdown-main-container';
countdownMain.innerHTML = `
    <span class="sale-text">SALE ENDS</span>
    <div class="countdown-container">
        <div class="countdown-date" id="countdown-days">00 :</div>  
        <div class="countdown-text">Days</div>
    </div>
    <div class="countdown-container">
        <div class="countdown-date" id="countdown-hours">00 :</div>
        <div class="countdown-text">Hours</div>
    </div>
    <div class="countdown-container">
        <div class="countdown-date" id="countdown-minutes">00 :</div> 
        <div class="countdown-text">Min</div>
    </div>
    <div class="countdown-container">
        <div class="countdown-date" id="countdown-seconds">00</div>
        <div class="countdown-text">Secs</div>
    </div>
`;

// 创建外层容器并插入主结构
const newHTML = document.createElement('div');
newHTML.setAttribute('id', 'randb-countdownSale');
newHTML.appendChild(countdownMain);

// 插入到页面(只执行一次)
const countdownContent = document.querySelector('.col-sm-6');
countdownContent.prepend(newHTML);

// 保存数值元素的引用,方便后续更新
const daysEl = document.getElementById('countdown-days');
const hoursEl = document.getElementById('countdown-hours');
const minutesEl = document.getElementById('countdown-minutes');
const secondsEl = document.getElementById('countdown-seconds');

// Update the count down every 1 second
var x = setInterval(function() {
    // Get today's date and time
    var now = new Date().getTime();

    // Find the distance between now and the count down date
    var distance = countDownDate - now;

    // --- 处理倒计时结束的情况 ---
    if (distance < 0) {
        clearInterval(x);
        countdownMain.innerHTML = '<span class="sale-text">SALE HAS ENDED</span>';
        return;
    }

    // Time calculations for days, hours, minutes and seconds
    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);

    // --- 关键改动:只更新元素文本,不重新创建DOM ---
    daysEl.textContent = `${makeMeTwoDigits(days)} :`;
    hoursEl.textContent = `${makeMeTwoDigits(hours)} :`;
    minutesEl.textContent = `${makeMeTwoDigits(minutes)} :`;
    secondsEl.textContent = makeMeTwoDigits(seconds);

}, 1000);


jQuery('.ib-text').remove();
document.querySelector('.info-bar').style.height = "52px";
document.querySelector('.oc-panel').style.paddingTop = "10px";

const coutdownStyle = `<style branchname="countdownSale">
.countdown-main-container {
   flex-direction: row; 
   display: flex;
   align-items: center;
   gap: 10px;
}
.countdown-container {
    display: flex; 
    justify-items: center; 
    align-items: center; 
    flex-wrap: wrap;
    flex-direction: column;
}
.sale-text {
    font-family: 'Playfair Display';
    font-size: 20px;
    color: #ffffff;
    font-weight: 400;
    padding-right: 10px;
}

.countdown-date {
    font-size: 20px;
    color: #fff;
}
.countdown-text {
    color:#fff;
}
#colon {
    padding-left: 20px;
}
</style>
`;

jQuery("header").append(coutdownStyle);

核心改动说明

  1. DOM结构只创建一次:在setInterval外部完成倒计时容器的创建和插入,避免重复生成组件
  2. 保存元素引用:提前获取days/hours等数值元素的DOM引用,减少定时器内的DOM查询开销
  3. 仅更新文本内容:定时器内部只修改元素的textContent,不重新渲染整个组件
  4. 增加结束逻辑:当倒计时结束时,清除定时器并替换为结束提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:31:02