当前位置:首页 > JavaScript

秒表实现js

2026-02-01 10:10:02JavaScript

使用 Date 对象实现基础秒表

通过 Date 对象记录开始时间和当前时间,计算差值实现秒表功能:

let startTime;
let elapsedTime = 0;
let timerInterval;

function startTimer() {
  startTime = new Date() - elapsedTime;
  timerInterval = setInterval(updateTimer, 10);
}

function updateTimer() {
  const currentTime = new Date();
  elapsedTime = currentTime - startTime;
  displayTime(elapsedTime);
}

function displayTime(time) {
  const formattedTime = new Date(time).toISOString().substr(11, 8);
  document.getElementById('display').textContent = formattedTime;
}

function pauseTimer() {
  clearInterval(timerInterval);
}

function resetTimer() {
  clearInterval(timerInterval);
  elapsedTime = 0;
  document.getElementById('display').textContent = '00:00:00';
}

使用 performance.now() 实现高精度秒表

对于需要更高精度的场景(如游戏、性能测试),推荐使用 performance.now()

let startTimestamp;
let running = false;
let accumulatedTime = 0;

function start() {
  if (!running) {
    startTimestamp = performance.now();
    running = true;
    requestAnimationFrame(update);
  }
}

function update() {
  if (running) {
    const currentTime = performance.now();
    const elapsed = (currentTime - startTimestamp) + accumulatedTime;
    render(elapsed);
    requestAnimationFrame(update);
  }
}

function pause() {
  if (running) {
    accumulatedTime += performance.now() - startTimestamp;
    running = false;
  }
}

function reset() {
  accumulatedTime = 0;
  running = false;
  render(0);
}

function render(time) {
  const seconds = Math.floor(time / 1000) % 60;
  const minutes = Math.floor(time / 60000) % 60;
  const hours = Math.floor(time / 3600000);
  document.getElementById('display').textContent = 
    `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
}

使用 Web Worker 实现后台计时

避免主线程阻塞的解决方案:

// main.js
const timerWorker = new Worker('timer-worker.js');
timerWorker.onmessage = function(e) {
  document.getElementById('display').textContent = e.data;
};

document.getElementById('start').addEventListener('click', () => {
  timerWorker.postMessage('start');
});

// timer-worker.js
let startTime;
let interval;

self.onmessage = function(e) {
  if (e.data === 'start') {
    startTime = Date.now();
    interval = setInterval(() => {
      const elapsed = Date.now() - startTime;
      const timeStr = new Date(elapsed).toISOString().substr(11, 8);
      self.postMessage(timeStr);
    }, 100);
  }
};

完整组件化实现示例

封装为可复用的 ES6 类:

秒表实现js

class Stopwatch {
  constructor(displayElement) {
    this.display = displayElement;
    this.isRunning = false;
    this.startTime = 0;
    this.elapsedTime = 0;
  }

  start() {
    if (!this.isRunning) {
      this.startTime = Date.now() - this.elapsedTime;
      this.isRunning = true;
      this.tick();
    }
  }

  tick() {
    if (this.isRunning) {
      this.elapsedTime = Date.now() - this.startTime;
      this.display.textContent = this.formatTime(this.elapsedTime);
      requestAnimationFrame(() => this.tick());
    }
  }

  pause() {
    this.isRunning = false;
  }

  reset() {
    this.isRunning = false;
    this.elapsedTime = 0;
    this.display.textContent = this.formatTime(0);
  }

  formatTime(milliseconds) {
    const date = new Date(milliseconds);
    return date.toISOString().substr(11, 8);
  }
}

// 使用示例
const display = document.getElementById('display');
const myStopwatch = new Stopwatch(display);

注意事项

  • 浏览器兼容性:performance.now() 在现代浏览器中支持良好,但在旧版IE中需要polyfill
  • 内存泄漏:清除不再使用的interval或animation frame
  • 移动端优化:考虑使用requestAnimationFrame而非setInterval以获得更好的电池效率
  • 暂停精度:累计暂停时间时要注意时间补偿逻辑

标签: 秒表js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…