audio元素的currenttime属性返回以秒为单位的浮点数,表示当前播放时长,需通过timeupdate事件周期性监听获取实时值,其他事件无法保证时间更新。

audio 元素的 currentTime 属性就是实时播放时间
它返回的是一个以秒为单位的浮点数(如 12.345),表示当前已播放的时长。这个值可读可写,但“实时获取”必须靠监听事件驱动,不能靠轮询或一次性读取。
必须用 timeupdate 事件监听,不是 play 或 loadeddata
timeupdate 是浏览器在播放过程中**周期性触发**的事件(通常每 200–250ms 一次),专门用于同步当前时间。其他事件不保证时间更新:
-
play只在开始播放时触发一次,此时currentTime可能还是 0 或旧值 -
loadeddata表示媒体元数据加载完成,但播放未必开始,currentTime不一定动 -
seeking/seeked只在拖拽时触发,漏掉正常播放过程中的变化
监听时要注意 currentTime 的精度和边界行为
实际使用中容易忽略三点:
- 刚加载完音频时,
currentTime可能为NaN或0,需检查audio.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA再读取 - 拖拽后可能触发多次
timeupdate,但currentTime在seeked后才真正稳定,若要做 UI 同步,建议加个防抖或只在seeked后首次timeupdate更新 - 当音频暂停或结束时,
timeupdate会停止触发,所以不要依赖它来判断“是否还在播”——得结合paused和ended属性
简单示例:
const audio = document.querySelector('audio');
audio.addEventListener('timeupdate', () => {
if (audio.readyState
<h3>想高频率获取?别强行改触发间隔</h3>
<p>浏览器控制 <code>timeupdate</code> 频率,无法通过 JS 修改。有人试图用 <code>requestAnimationFrame</code> 或 <code>setInterval</code> 每帧读 <code>currentTime</code>,但这既不准(可能读到未渲染的中间状态),又浪费资源,还可能因音频缓冲卡顿导致时间跳变。真实场景下,250ms 级别的更新已足够做进度条、字幕同步等大多数任务。真有亚帧级需求(比如音频可视化分析),应该用 <code>Web Audio API</code> 接管解码,而不是依赖 <code><audio></audio></code> 标签。</p>前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











