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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:18:27