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

如何在浏览器关闭后保留天数统计?实现每5天显示HTML按钮

解决浏览器关闭后计时不重置 + 每5天显示按钮的方案

嘿,我来帮你搞定这两个问题!你之前用setInterval的方案确实会在浏览器关闭后重置,因为它只在内存里维持计时,咱们得借助**本地存储(localStorage)**来持久化时间数据,同时调整逻辑实现每5天触发一次的需求。

核心思路

  1. 用localStorage存储上一次按钮显示的时间戳,这样浏览器关闭再打开时,能读取到历史时间,不会从零开始。
  2. 页面加载时,计算当前时间和存储时间的差值,判断是否已经过了5天的整数倍:
    • 如果已经过了,直接显示按钮并更新存储时间。
    • 如果没到,计算剩余时间,设置定时器等待到点后显示按钮,之后循环触发。

完整代码实现

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
  <form action="save" method="post">
    <label>若未看到添加按钮,请等待...</label>
    <button id="btn" style="display: none;">执行召回操作</button>
  </form>

  <script>
    // 配置参数:每5天显示一次
    const INTERVAL_DAYS = 5;
    const INTERVAL_MS = INTERVAL_DAYS * 24 * 60 * 60 * 1000; // 转换为毫秒
    const STORAGE_KEY = 'lastButtonTriggerTime'; // 本地存储的键名

    // 显示按钮的函数
    function showRecallButton() {
      const btn = document.getElementById("btn");
      btn.style.display = 'block';
      // 可选:如果希望用户点击后隐藏按钮,添加下面的逻辑
      // btn.addEventListener('click', function() {
      //   this.style.display = 'none';
      // }, { once: true }); // 只绑定一次点击事件
    }

    // 初始化计时逻辑
    function initTimer() {
      const now = Date.now();
      let lastTriggerTime = localStorage.getItem(STORAGE_KEY);

      // 第一次访问时,存储当前时间作为起始点
      if (!lastTriggerTime) {
        localStorage.setItem(STORAGE_KEY, now.toString());
        lastTriggerTime = now.toString();
      }

      // 转换为数字类型
      lastTriggerTime = parseInt(lastTriggerTime, 10);
      const timeDiff = now - lastTriggerTime;

      // 检查是否已经过了至少一个5天周期
      const cyclesPassed = Math.floor(timeDiff / INTERVAL_MS);
      if (cyclesPassed > 0) {
        showRecallButton();
        // 更新存储时间为当前时间,从现在开始计算下一个周期
        localStorage.setItem(STORAGE_KEY, now.toString());
      }

      // 计算距离下一次显示按钮的剩余时间
      const remainingTime = INTERVAL_MS - (timeDiff % INTERVAL_MS);
      
      // 设置首次定时器,到点后显示按钮并启动循环定时器
      setTimeout(() => {
        showRecallButton();
        localStorage.setItem(STORAGE_KEY, Date.now().toString());
        
        // 之后每5天自动触发一次
        setInterval(() => {
          showRecallButton();
          localStorage.setItem(STORAGE_KEY, Date.now().toString());
        }, INTERVAL_MS);
      }, remainingTime);
    }

    // 页面加载完成后初始化
    window.addEventListener('load', initTimer);
  </script>
</body>
</html>

关键代码解释

  • localStorage持久化:用localStorage.getItem和localStorage.setItem读写时间戳,确保浏览器关闭后数据不会丢失。
  • 时间差计算:通过Date.now()获取当前时间戳,和存储的时间戳对比,判断是否满足5天的间隔要求。
  • 定时器逻辑:先用setTimeout处理首次剩余时间,之后用setInterval维持每5天的循环触发,避免页面刷新后定时器丢失。

注意事项

  • 本地存储的数据是字符串类型,需要转换为整数再进行计算。
  • 如果用户手动修改浏览器的本地存储数据,可能会影响计时逻辑,但普通用户很少这么操作;如果需要更严谨的方案,可以结合服务器存储用户的时间记录。
  • 定时器存在微小的精度误差,但对于天级别的计时来说完全可以忽略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:42:02