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

JavaScript新手求助:如何为可重置计时器添加.mp3音频播放功能?

解决方案

1. 全局创建音频实例

先在代码开头声明全局的音频对象,复用它来避免重复加载音频文件:

const alarmAudio = new Audio('alarm.mp3');

确保alarm.mp3和你的HTML文件在同一目录,或者填写正确的相对路径(比如./audio/alarm.mp3)。

2. 修复计时器重复运行的bug

原代码每次调用startTimer都会新建一个setInterval,导致多个计时器同时跑,倒计时会混乱。新增变量保存计时器ID,启动前清除旧计时器:

let timerInterval; // 保存计时器ID,用于后续清除

3. 倒计时结束时播放音频

在timer函数里判断倒计时是否结束,触发音频播放:

function startTimer(duration) {
    if (timerInterval) clearInterval(timerInterval); // 清除旧计时器
    start = Date.now();

    function timer() {
        diff = duration - (((Date.now() - start) / 1000) | 0);

        // 倒计时结束逻辑
        if (diff <= 0) {
            display.textContent = "00:00";
            alarmAudio.play(); // 播放警报
            return; // 停止后续计时
        }

        minutes = (diff / 60) | 0;
        seconds = (diff % 60) | 0;

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;
        
        display.textContent = minutes + ":" + seconds;
    };
    timer();
    timerInterval = setInterval(timer, 1000); // 保存新计时器ID
}

4. 重置计时器时停止音频

在resetTimer里添加暂停并重置音频的逻辑,避免重置后警报继续响:

function resetTimer(){
    if (timerStarted) {
        alarmAudio.pause();
        alarmAudio.currentTime = 0; // 把音频进度拉回开头
        startTimer(fiveMinutes);
    }
}

5. 绑定鼠标/键盘重置事件

在window.onload里添加事件监听,实现鼠标移动或按键时重置倒计时:

window.onload = function () {
    display = document.querySelector('#time');
    // 监听鼠标移动
    document.addEventListener('mousemove', resetTimer);
    // 监听键盘按键
    document.addEventListener('keydown', resetTimer);
}

完整修改后的代码

const fiveMinutes = 5;
const alarmAudio = new Audio('alarm.mp3');
var start, diff, minutes, seconds;
var display;
var timerStarted = false;
var resetCtr = 0;  
var debugMsg;
const debug = true;
let timerInterval;


function startTimer(duration) {
    if (timerInterval) clearInterval(timerInterval);
    start = Date.now();

    function timer() {
        diff = duration - (((Date.now() - start) / 1000) | 0);

        if (diff <= 0) {
            display.textContent = "00:00";
            alarmAudio.play();
            return;
        }

        minutes = (diff / 60) | 0;
        seconds = (diff % 60) | 0;

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;
        
        display.textContent = minutes + ":" + seconds;
    };
    timer();
    timerInterval = setInterval(timer, 1000);
}

function btnStartTimer() {
    if (!timerStarted) {
        timerStarted = true;
        startTimer(fiveMinutes);
    }
}

function resetTimer(){
    if (timerStarted) {
        alarmAudio.pause();
        alarmAudio.currentTime = 0;
        startTimer(fiveMinutes);
    }
}


window.onload = function () {
    display = document.querySelector('#time');
    document.addEventListener('mousemove', resetTimer);
    document.addEventListener('keydown', resetTimer);
}

注意事项

  • 浏览器会限制无用户交互的自动音频播放,你的btnStartTimer点击事件已经满足用户交互要求,不会触发播放限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:37:48