如何在audio.currentTime等于数组内数值时触发if语句?
音频播放到指定时间触发事件的实现方案
直接判断audio.currentTime与数组中的值严格相等可能存在精度问题——因为currentTime是浮点数,播放时的时间戳可能是类似12.0001这样的非整数,导致严格匹配永远触发不了。推荐用近似匹配或者取整处理,以下是两种可行方案:
方案一:近似匹配(推荐)
通过判断当前时间与目标时间的差值在极小范围内(比如±0.1秒)来触发事件,同时用集合避免重复触发:
// 定义目标时间数组 var songTimer = [0, 12, 49]; // 获取音频元素 const audio = document.querySelector('audio'); // 存储已触发的时间,防止重复执行 const triggeredTimes = new Set(); // 监听播放进度更新事件 audio.addEventListener('timeupdate', () => { const currentTime = audio.currentTime; songTimer.forEach(targetTime => { // 近似匹配,允许0.1秒的误差 if (Math.abs(currentTime - targetTime) < 0.1 && !triggeredTimes.has(targetTime)) { console.log(`到达指定时间:${targetTime}秒`); // 这里添加你需要执行的其他逻辑 triggeredTimes.add(targetTime); } }); });
方案二:取整后严格匹配
如果只需要匹配整数时间点,可以先对currentTime取整再判断:
var songTimer = [0, 12, 49]; const audio = document.querySelector('audio'); const triggeredTimes = new Set(); audio.addEventListener('timeupdate', () => { // 对当前时间向下取整 const currentTime = Math.floor(audio.currentTime); songTimer.forEach(targetTime => { if (currentTime === targetTime && !triggeredTimes.has(targetTime)) { console.log(`到达指定时间:${targetTime}秒`); // 添加自定义逻辑 triggeredTimes.add(targetTime); } }); });
关键说明
timeupdate事件会在音频播放进度变化时频繁触发(通常每秒4-6次),适合用来监听时间变化- 使用
Set存储已触发的时间,是为了避免同一时间点因事件多次触发而重复执行逻辑 - 近似匹配的误差范围可以根据需求调整(比如改成
0.05提升精度)
内容的提问来源于stack exchange,提问作者itsbazs
相关产品推荐
相关产品推荐

