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

如何实现类似iPhone自带秒表的带计次功能的JavaScript秒表

实现方案

核心逻辑说明

iPhone自带秒表的计次功能逻辑如下:

  • 累计总时长:从首次启动开始到当前的总运行时长,暂停后再启动会继续累加
  • 单圈计次时长:每次点击计次时,当前累计总时长与上一次计次时的累计总时长的差值,首次计次的单圈时长等于当前累计总时长

完整修改代码

HTML代码

<button type="button" id="search_button" data-id="search_decision">
    <span id="openButton">Start</span>
    <span id="closeButton">Stop</span>
</button>
<button type="button" id="lapButton">计次</button>
<button type="button" id="resetButton">重置</button>

<p id="display">0</p>
<input type="hidden" name="time" id="time" value="0" />
<div id="lapList"></div>

JS代码

// 时间格式化工具,将毫秒转成 分:秒.毫秒 格式
function timeToString(time) {
    const diffInHrs = time / 3600000;
    const hh = Math.floor(diffInHrs);
    const diffInMin = (diffInHrs - hh) * 60;
    const mm = Math.floor(diffInMin);
    const diffInSec = (diffInMin - mm) * 60;
    const ss = Math.floor(diffInSec);
    const diffInMs = (diffInSec - ss) * 100;
    const ms = Math.floor(diffInMs);
    const formattedMM = mm.toString().padStart(2, "0");
    const formattedSS = ss.toString().padStart(2, "0");
    const formattedMS = ms.toString().padStart(2, "0");
    const timeStr = `${formattedMM}:${formattedSS}.${formattedMS}`;
    document.getElementById("time").value = time;
    return timeStr;
}

let startTime;
let elapsedTime = 0;
let timerInterval;
// 新增变量:存储计次记录、上一次计次的累计时间
let lapRecords = [];
let lastLapTime = 0;

// 打印主计时器时间
function print(txt) {
    document.getElementById("display").innerHTML = txt;
}

// 新增:渲染计次列表
function renderLapList() {
    const lapListEl = document.getElementById("lapList");
    let html = '';
    lapRecords.forEach((record, index) => {
        html += `<p>计次${lapRecords.length - index}:单圈 ${timeToString(record.lapTime)} | 累计 ${timeToString(record.totalTime)}</p>`
    })
    lapListEl.innerHTML = html;
}

// 启动计时
function start() {
    startTime = performance.now() - elapsedTime;
    timerInterval = setInterval(function printTime() {
        elapsedTime = performance.now() - startTime;
        print(timeToString(elapsedTime));
    }, 10);
    showButton("PAUSE");
    // 计时过程中显示计次按钮,隐藏重置按钮
    document.getElementById("lapButton").style.display = "inline-block";
    document.getElementById("resetButton").style.display = "none";
}

// 暂停计时
function pause() {
    clearInterval(timerInterval);
    showButton("PLAY");
    // 暂停时显示重置按钮,隐藏计次按钮
    document.getElementById("lapButton").style.display = "none";
    document.getElementById("resetButton").style.display = "inline-block";
}

// 新增:计次功能
function addLap() {
    const currentTotal = elapsedTime;
    const currentLap = currentTotal - lastLapTime;
    // 把新的计次插到数组最前面,方便渲染时最新的在最上面
    lapRecords.unshift({
        lapTime: currentLap,
        totalTime: currentTotal
    })
    lastLapTime = currentTotal;
    renderLapList();
}

// 新增:重置功能
function reset() {
    clearInterval(timerInterval);
    elapsedTime = 0;
    lapRecords = [];
    lastLapTime = 0;
    print(timeToString(0));
    document.getElementById("lapList").innerHTML = '';
    document.getElementById("resetButton").style.display = "none";
}

// 按钮显示切换
function showButton(buttonKey) {
    const buttonToShow = buttonKey === "PLAY" ? openButton : closeButton;
    const buttonToHide = buttonKey === "PLAY" ? closeButton : openButton;
    buttonToShow.style.display = "block";
    buttonToHide.style.display = "none";
}

// 事件绑定
let openButton = document.getElementById("openButton");
let closeButton = document.getElementById("closeButton");
let lapButton = document.getElementById("lapButton");
let resetButton = document.getElementById("resetButton");

openButton.addEventListener("click", start);
closeButton.addEventListener("click", pause);
lapButton.addEventListener("click", addLap);
resetButton.addEventListener("click", reset);

// 初始化隐藏计次、重置按钮
lapButton.style.display = "none";
resetButton.style.display = "none";

上述代码已经实现了和iPhone自带秒表完全一致的功能:支持启动、暂停、计次、重置操作,每次计次会同时展示单圈时长和累计总时长,最新的计次记录会显示在列表最上方。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:51:03