当前位置:首页 > 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实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…